2012-12-26
■ JOI予選参加記(2012/12/16)
初めてのJOIです!
前日まで期末があったのでCodingしてない><
期末なんて嫌いだっ!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
起床(11:15)
予選練習が終了していた(絶望)
準備(~13:00)
すたーと!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. やるだけ(20点)
#include#include #include #include #include using namespace std; typedef pair<int,int> P; #define make_pair mp #define first f #define second s int n,a,b,c,d; int main(){ scanf("%d",&n); scanf("%d %d %d %d",&a,&b,&c,&d); int e=a%c==0?a/c:a/c+1; int f=b%d==0?b/d:b/d+1; printf("%d\r\n",n-max(e,f)); return 0; }
2.やるだけ(20点)
#include#include #include #include #include using namespace std; typedef pair<int,int> P; #define make_pair mp #define first f #define second s int num[205][3],n,ans[205]={}; int main(){ scanf("%d",&n); for(int i=0;i "%d %d %d",&num[i][0],&num[i][1],&num[i][2]); } bool a=false; for(int k=0;k<3;k++){ for(int i=0;i for(int j=0;j if(i!=j){ if(num[i][k]==num[j][k]){ a=true; break; } } } if(!a){ ans[i]+=num[i][k];} a=false; } } for(int i=0;i "%d\r\n",ans[i]); } return 0; }
3.やるだけだけどミスしていた(8点)
#include#include #include #include #include using namespace std; typedef pair<int,int> P; #define make_pair mp #define first f #define second s int n,num=0; char ans[30]; char str[101][105]; bool a=true; int main(){ scanf("%d",&n); scanf("%s",&ans); int ppp=strlen(ans); char s1=ans[0],s2=ans[1]; for(int i=0;i "%s",&str[i]); int length=strlen(str[i]); for(int j=0;j if(str[i][j]==s1){ for(int k=j+1;k if(str[i][k]==s2){ int br=k-j,now=j; for(int g=2;g if(now+br*g true; }else{ a=false; //ここにbreak;を入れなかったので途中までがどうであれ,str[now+br*(ppp-1)]==ans[ppp-1]ならばok,というミスが発生した } } if(a){ num++; goto we; } a=true; } } } } we:; } printf("%d\n",num); return 0; }
4.DP(20点)
#include#include #include #include #include using namespace std; typedef pair<int,int> P; #define make_pair mp #define first f #define second s int dp[205][105]; int cloth[205][3]; int temp[205],n,d; int main(){ memset(dp,-1,sizeof(dp)); scanf("%d %d",&d,&n); for(int i=1;i<=d;i++){ scanf("%d",&temp[i]); } for(int i=1;i<=n;i++){ scanf("%d %d %d",&cloth[i][0],&cloth[i][1],&cloth[i][2]); } for(int i=1;i<=n;i++){ if(cloth[i][0]<=temp[1] && temp[1]<=cloth[i][1]){ dp[1][cloth[i][2]]=0; } } for(int i=2;i<=d;i++){ for(int j=1;j<=n;j++){ if(cloth[j][0]<=temp[i] && temp[i]<=cloth[j][1]){ for(int h=0;h<=100;h++){ if(dp[i-1][h]!=-1){ dp[i][cloth[j][2]]=max(dp[i][cloth[j][2]],dp[i-1][h]+max(cloth[j][2],h)-min(h,cloth[j][2])); } } } } } int ans=0; for(int i=0;i<=100;i++){ ans=max(ans,dp[d][i]); } printf("%d\r\n",ans); return 0; }
5.全探索(4点)
#include#include #include #include #include using namespace std; typedef pair<int,int> P; #define make_pair mp #define first f #define second s int n,kk; int con[51][6]; int field[101][101][101]={}; int main(){ scanf("%d %d",&n,&kk); for(int i=0;i "%d %d %d %d %d %d",&con[i][0],&con[i][1],&con[i][2],&con[i][3],&con[i][4],&con[i][5]); } for(int i=0;i<=100;i++){ for(int j=0;j if(con[j][2]<=i && con[j][5]>i){ for(int a=con[j][0];a 3];a++){ for(int b=con[j][1];b 4];b++){ field[a][b][i]++; } } } } } int ans=0; for(int i=0;i<=100;i++){ for(int j=0;j<=100;j++){ for(int k=0;k<=100;k++){ if(field[i][j][k]>=kk){ ans++; } } } } printf("%d\r\n",ans); return 0; }
6.できない(0点)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
しゅうりょー!!
20+20+8+20+4+0=72(Aランク)でした。
3で8点とれたことは本当に運がよかった。
あと、5で4点とったことが最終的に助けてくれた。
部分点はとても大切だと分かった。
本選はこんなミスをしないように気をつけます><