日常学校考试,这次试卷大致是 一道字符串处理 + 一道二分 + 一道看起来十分像DFS的动规,期望值210,实际180,100+80+0.好吧还是看下试卷.
T1: 传送门
T2: 传送门
T3: 传送门
T1:
一道简单的字符串处理 (模拟),也就打了一个小时。原理和现实生活相近,类似于智能推荐的输入按键。模拟题意,逐个判断(简单易懂)。这道题认真模拟,注意最后输出的换行顺序就好。
本题思路
- 先输入n个,目的地名称,再输入已经输进去的字母
- 然后对于每一个输入进去的字母都进行判断是否和目的地一致(只要有一个不一样就做标记,在最后搜索时跳过)
- 对于每一个目的地,只要没被做过标记那么他的没输入的下一个字母就在输出的表数组上记录
- 最后输出一个表
AC代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; char f[60][110],c[259]; int i,n,ans[27],k=-1,l; bool b[90]; void print(){ printf("***"); for(i=1;i<=26;i++){ if(ans[i])cout<<char(i+64); else printf("*"); if((i+3)%8==0 && i>4)cout<<endl; } printf("***"); } int main(){ cin>>n; for(i=1;i<=n;i++)cin>>f[i]; cin>>c; l = strlen(c); while(++k < l){ for(i=1;i<=n;i++){ if(!b[i])if(f[i][k] != c[k])b[i]=true; } } for(i=1;i<=n;i++){ if(!b[i])ans[f[i][l]-64]=1; } print(); return 0; }
T2:
自己用暴力做的80分,正解二分,没什么多说的了。
暴力代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define maxn 100003 using namespace std; int a,b,c,i,j,k; long long ans; //此题的大坑点,无数打正解的人都wa在这 int cake1[maxn],cake2[maxn],cake3[maxn]; int main(){ scanf("%d%d%d",&a,&b,&c); for(i=1;i<=a;i++)cin>>cake1[i]; for(i=1;i<=b;i++)cin>>cake2[i]; for(i=1;i<=c;i++)cin>>cake3[i]; for(i=1;i<=a;i++){ for(j=1;j<=b;j++){ if(cake1[i]>=cake2[j])continue; for(k=1;k<=c;k++){ if(cake2[j]>=cake3[k])continue; ans+=1; } } } printf("%d",ans); return 0; }
T3:
一道动规题,当初做时以为是DFS,结果爆0了.......
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; #define maxn 5000 #define inf 0xfffffff int sc[maxn+5],n,l,r,ans=-inf,f[maxn+5]; int main(){ cin>>n>>l>>r; for(int i=1;i<=n;i++){ cin>>sc[i]; f[i]=-inf; } f[1]=sc[1]; for(int i=2;i<=n;i++){ for(int j=l;j<=r;j++){ if(i-j > 0)f[i]=max(f[i],f[i-j]); } if(f[i]!=-inf)f[i]+=sc[i]; if(i+l>=n)ans=max(ans,f[i]); } cout<<ans; return 0; }