こんな問題セットでこの成績はまずいでしょ。
1.やるだけ
#include<stdio.h> #include<algorithm> using namespace std; int main(){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",a-b+c-d); return 0; }
2.やるだけ
#include<stdio.h> #include<algorithm> using namespace std; char a[1024]; char b[1024]; int main(){ int c; scanf("%d%s%s",&c,a,b); int ret=0; for(int i=0;i<c;i++){ int count=0; for(int j=0;j<c;j++)if(a[j]==b[(i+j)%c])count++; ret=max(ret,count); } printf("%d\n",ret); return 0; }
3.左から決めていく。表示されるのが遅かったのでほげ
#include<stdio.h> int dat[1000][1000]; int ans[1000][1000]; int dx[]={1,1,0,0,0,-1,-1,-1}; int dy[]={0,-1,1,0,-1,1,0,-1}; int main(){ int a,b; scanf("%d%d",&a,&b); for(int i=0;i<b;i++) for(int j=0;j<a;j++) scanf("%d",&dat[i][j]); for(int i=0;i<b-2;i++){ for(int j=0;j<a-1;j++){ int p=dat[i][j]; for(int k=0;k<8;k++){ if(0<=i+dx[k]&&i+dx[k]<b&&0<=j+dy[k]&&j+dy[k]<a)p-=ans[i+dx[k]][j+dy[k]]; } ans[i+1][j+1]=p; } } for(int i=0;i<b;i++){ for(int j=0;j<a;j++){ if(j)printf(" "); printf("%d",ans[i][j]); } printf("\n"); } return 0; }
4.DP。この形は始めて見たけど。
#include<stdio.h> #include<algorithm> using namespace std; int dat[100000]; int dp[100000]; int main(){ int a,b,c; scanf("%d%d%d",&a,&b,&c); c--; for(int i=0;i<b;i++){ scanf("%d",dat+i); dat[i]--; } for(int i=0;i<100000;i++)dp[i]=-99999999; dp[c]=0; for(int i=0;i<b;i++){ int k=max(dp[dat[i]],dp[dat[i]+1]+1); dp[dat[i]+1]=max(dp[dat[i]+1],dp[dat[i]]+1); dp[dat[i]]=k; } printf("%d\n",dp[0]); return 0; }
5.BFSするだけ
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; int to[10000][10]; int bfs[10000]; int main(){ int a,b; scanf("%d%d",&a,&b); for(int i=0;i<a-1;i++){ for(int j=0;j<b;j++){ scanf("%d",&to[i][j]); to[i][j]--; } } for(int i=0;i<a;i++)bfs[i]=99999999; bfs[0]=0; queue<int> Q; Q.push(0); while(Q.size()){ int at=Q.front(); if(at==a-1)break; Q.pop(); for(int i=0;i<b;i++){ if(bfs[to[at][i]]==99999999){ bfs[to[at][i]]=bfs[at]+1; Q.push(to[at][i]); } } if(bfs[at+1]==99999999){ bfs[at+1]=bfs[at]+1; Q.push(at+1); } } printf("%d\n",bfs[a-1]); return 0; }
6.むずかしそうだけど適当なコードを書けば通るらしい。*は-より先に計算されるので、これをミスるとWAをもらってしまう。
#include<stdio.h> #include<algorithm> using namespace std; int R[1000]; int C[1000]; bool p[1000001]; bool q[1000001]; int main(){ int a,b; scanf("%d%d",&a,&b); for(int i=0;i<a;i++){ scanf("%d",R+i); if(R[i]>a*b||p[R[i]]){ printf("0\n"); return 0; } p[R[i]]=true; } std::sort(R,R+a); for(int j=0;j<b;j++){ scanf("%d",C+j); if(C[j]>a*b||q[C[j]]){ printf("0\n"); return 0; } q[C[j]]=true; } long long MOD=1000000007; std::sort(C,C+b); long long ret=1; for(int i=a*b;i>0;i--){ if(p[i]){ if(q[i]); else ret=(ret*(b-(lower_bound(C,C+b,i+1)-C)))%MOD; }else if(q[i])ret=(ret*(a-(lower_bound(R,R+a,i+1)-R)))%MOD; else ret=ret*((a-(lower_bound(R,R+a,i+1)-R))*(b-(lower_bound(C,C+b,i+1)-C))-(a*b-i))%MOD; } printf("%lld\n",ret); return 0; }
6完1WA、普通にICPC形式だったら2位? NWR(No Wolf Rights)