- wsh 的博客
Day 11总结
- @ 2024-7-19 19:25:38
T1小W的病毒歼灭战(队列)
总结(自己)
思路错了..........(我到底是多天才能想到flag标记数组啊[怒]),一部分原因是因为对第一题的蔑视(以为来打卡的)
思路
水题,队列存下弹夹,桶存下种类。秒了
附AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,t[1010],dl[1010],tt=-1,hh,ans;
int main()
{
freopen("bd.in","r",stdin);
freopen("bd.out","w",stdout);
cin>>m>>n;
for(int i=1;i<=n;i++){
int a;
cin>>a;
if(t[a]==0) dl[++tt]=a,t[a]++,ans++;
while(tt-hh+1>m) t[dl[hh]]--,hh++;
}
cout<<ans;
return 0;
}
T2小田的三倍数(数学)
总结(自己)
秒了
思路
各位数字之和为3则是3的倍数,氺
附AC代码
#include<bits/stdc++.h>
using namespace std;
int t,ans;
int main()
{
freopen("three.in","r",stdin);
freopen("three.out","w",stdout);
cin>>t;
while(t--)
{
ans=0;
int n;
cin>>n;
while(n--){
string a;
cin>>a;
for(int i=0;i<a.size();i++){
ans+=a[i]-'0';
}
}
if(ans%3==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
T3小田的省钱计划(递推)
总结(自己)
思路错误(我那个方法至今还未找出反例[笑])
思路
这题其实就是求最大子段和 递推写就完了
定义一个数组f[],表示以i结尾的最大子段和 然后枚举每一个位置f[i] 一共有两种情况
如果f[i-1]的值为负数,那么我肯定不用接这个数了,就以自己结尾 递推式就是
如果f[i-1]的值为正数,那么就将这个数接上 递推式就是
推出递推式后这题随便A
附AC代码
#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],f[100010],x;
int main()
{
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(f[i-1]<0) f[i]=a[i]-x;
else f[i]=f[i-1]+a[i]-x;
}
long long mix=0;
for(int i=1;i<=n;i++)
{
mix=max(mix,f[i]);
}
cout<<mix;
return 0;
}
T4计算表达式的值(栈)
* 总结(自己)*
忘模板了......(默默的复习了一遍模板[酸])
思路
套模板 改下优先级再增加个幂运算就行
附AC代码
#include<bits/stdc++.h>
using namespace std;
string a;
int tt1=-1,tt2=-1,s[100010];
char f[100010];
void js()
{
char fh=f[tt2--];
int s2=s[tt1--];
int s1=s[tt1--],x;
if(fh=='+') x=s1+s2;
else if(fh=='-') x=s1-s2;
else if(fh=='*') x=s1*s2;
else if(fh=='/') x=s1/s2;
else if(fh=='^')
{
x=1;
while(s2--){
x*=s1;
}
}
s[++tt1]=x;
}
int qs(int &i)
{
int sh=0;
i--;
while(a[i+1]<='9'&&a[i+1]>='0'){
i++;
sh=sh*10+a[i]-'0';
}
return sh;
}
unordered_map<char,int> yx{{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
int main()
{
freopen("bds.in","r",stdin);
freopen("bds.out","w",stdout);
cin>>a;
for(int i=0;i<a.size();i++){
if(a[i]<='9'&&a[i]>='0'){
s[++tt1]=qs(i);
}
else if(a[i]=='(') f[++tt2]=a[i];
else if(a[i]==')'){
while(f[tt2]!='(') js();
tt2--;
}
else{
while(tt1>=0&&yx[a[i]]<=yx[f[tt2]]) js();
f[++tt2]=a[i];
}
}
while(tt2>=0) js();
cout<<s[tt1];
return 0;
}
T5永夜的报应(数学)
总结(自己)
没时间.....(第一眼没思路就过了) 还有之前没认真听课(自己的债自己还[哭])
思路
老师说过异或就是没有进位的加法 所以所有分一组就行
附AC代码(巨短)
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main()
{
freopen("huiye.in","r",stdin);
freopen("huiye.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
ans=a^ans;
}
cout<<ans;
return 0;
}
T6 数学题2
总结(自己)
拿了50分还是挺满意的(毕竟最后十分钟),但距离对也就差个的统计约数而已