noi online(入门组) round3
果然这次的题目都太友好了....
我算了一下,如果我没有提交错代码
但是没什么好说的,,自己太粗心了...第二题答案换行了,第三题我在用不同的方法做,然后把错误的做法交上去了
P6565 [NOI Online #3 入门组]最急救助
这个题就很模板模板的用KMP就可以做出来啦,比较简单
比标准的KMP可能还要简单些,因为这个题目要匹配的字符串就直接给了,对于匹配字符串不需要预处理,所以显得还要更加简单一点
#include <bits/stdc++.h> using namespace std; const int N=305,inf=0x3f3f3f; char name[N][25],words[N][N]; char a[10]; int ans[N],p[N],m=3,maxx,n; void kmp(int k) { int len=strlen(words[k]+1); int j=0; for(int i=0;i<len;i++) { while(j>0&&words[k][i+1]!=a[j+1]) j=p[j]; if(words[k][i+1]==a[j+1]) j++; if(j==3){ ans[k]++;j=p[j]; if(ans[k]>=maxx){ maxx=ans[k];} } } } int main() { //freopen("save.in","r",stdin); //freopen("save.out","w",stdout); scanf("%d",&n); a[1]='s';a[2]='o';a[3]='s'; p[1]=0;p[2]=0;p[3]=1;//预处理可以直接处理 for(int i=1;i<=n;i++){ scanf("%s",name[i]+1); scanf("%s",words[i]+1); kmp(i); } for(int i=1;i<=n;i++) if(ans[i]==maxx) printf("%s ",name[i]+1); printf("\n"); printf("%d\n",maxx); return 0; }
这个题目直接比较也能过,数据比较小
#include<bits/stdc++.h> using namespace std; string name[105],xh; int m,a[105]; int main(){ int n; cin>>n; for(int i=0;i<n;i++)a[i]=0; for(int i=0;i<n;i++){ int count=0; cin>>name[i]>>xh; int l=xh.length(); for(int j=0;j+2<l;j++){ if(xh[j]=='s'&&xh[j+1]=='o'&&xh[j+2]=='s')count++; } if(count>=m){ m=count; a[i]=m; } } for(int i=0;i<n;i++){ if(a[i]==m)cout<<name[i]<<' '; } cout<<endl<<m; return 0; }
P6566 [NOI Online #3 入门组]观星(民间数据)
这个题目我觉得数据出得比较好,好吧我自己的代码有点小问题,所以只能得80分,我把计算最大值写在了if语句中,应该写在外面,所以会少一种情况。。。
但是我交上去的代码换行了!!!!!太久没考试了,导致我粗心的毛病越来越重了
这个题目数据好像dfs和bfs都可以,都差不多其实
#include <bits/stdc++.h> using namespace std; const int N=1e6+5,inf=0x3f3f3f; struct node{ int x,y; }; int pd[N],res,maxx; int n,m,a[1505][1505]; int d[8][2]={{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}}; void bfs(int x,int y) { queue<node>q;int ans=1; q.push((node){x,y}); a[x][y]=0; while(!q.empty()){ node p=q.front();q.pop(); for(int i=0;i<8;i++){ int rx=p.x+d[i][0],ry=p.y+d[i][1]; if(rx>=1&&rx<=n&&ry>=1&&ry<=m&&a[rx][ry]){ ans++;a[rx][ry]=0; q.push((node){rx,ry}); } } } //cout<<ans<<endl; if(!pd[ans]){ res++; pd[ans]=1; } else{ pd[ans]++; } maxx=max(maxx,ans*pd[ans]);//就是这里我没有写在外面 } int main() { //freopen("star.in","r",stdin); //freopen("star.out","w",stdout); char c; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>c; if(c=='*') a[i][j]=1; else a[i][j]=0; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(a[i][j]) bfs(i,j); } printf("%d %d\n",res,maxx); return 0; }
P6567 [NOI Online #3 入门组]买表(民间数据)
这个题目应该也有很多做法,可以是用多重背包的二进制转换成01背包来做,是一个动态规划的题目,也可以用有限硬币的方法来做,但可能就得不到满分吧
#include <bits/stdc++.h> using namespace std; const int N=500005,inf=0x3f3f3f3f; int num,n,m,p; int f[N],a[N]; long long sum; int main() { //freopen("watch.in","r",stdin); //freopen("watch.out","w",stdout); scanf("%d%d",&n,&m); int x,y; for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); sum+=x*y; int t=1; while(y>=t){ a[++num]=x*t; y-=t; t*=2; } a[++num]=x*y; } if(sum>N) sum=500000; f[0]=1; for(int i=1;i<=num;i++){ for(int j=sum;j>=a[i];j--) f[j]|=f[j-a[i]]; } for(int i=1;i<=m;i++) { scanf("%d",&p); if(f[p]>0) printf("Yes\n"); else printf("No\n"); } return 0; }