死んだ、もう引退、とか思ったけど(kitayutaに抜かれたので)実は順位が結構妥当であった(kitayutaが落としたからかもしれない)。大体TCの国内ランキングと同じくらい。
A
逆から見るだけ、なんで1時間気がつかないの
#include<stdio.h> #include<algorithm> using namespace std; int e[100]; int f[100]; int main(){ int a; scanf("%d",&a); for(int T=0;T<a;T++){ int b,c,d; scanf("%d%d%d",&b,&c,&d); int at=d; for(int i=0;i<c;i++){ scanf("%d%d",e+i,f+i); } for(int i=c-1;i>=0;i--){ if(at<=f[i]){ at=e[i]+at-1; }else if(at<=e[i]+f[i]-1){ at-=f[i]; } } printf("Case #%d: %d\n",T+1,at); } }
B
貪欲するだけ
なんでデバッグに1時間もかかるの
引き算で区間をもつのを楽にしています
#include<stdio.h> #include<algorithm> #include<vector> using namespace std; long long d[100]; long long e[100]; int f[100]; long long all[100]; pair<int,int > dat[100];//これは価値・種類番号 int main(){ int a; scanf("%d",&a); for(int T=0;T<a;T++){ int b,c; scanf("%d%d",&b,&c); for(int i=0;i<b;i++){ scanf("%lld%lld%d",d+i,e+i,f+i); dat[i]=make_pair(-f[i],i); } long long ret=0; std::sort(dat,dat+b); for(int i=0;i<b;i++){ int val=-dat[i].first; int at=dat[i].second; if(e[at]==0)continue; long long begin=max(1LL,e[at]-d[at]+1); long long end=e[at]; // printf("%d %lld %lld\n",val,begin,end); ret+=(end-begin+1)*val; for(int j=0;j<b;j++){ if(e[j]>end){ e[j]-=end-begin+1; }else{ e[j]=min(e[j],begin-1); } } } printf("Case #%d: %lld\n",T+1,ret); } }
C
適当なビット計算
まあすぐ気がついたので許される
#include<stdio.h> int bit[2][64]; int main(){ int a; scanf("%d",&a); for(int T=0;T<a;T++){ long long k; scanf("%lld",&k); for(int j=0;j<63;j++){ if(k&(1LL<<j))bit[0][j]=1; else bit[0][j]=0; } for(int j=0;j<63;j++)bit[1][j]=0; for(int j=0;j<63;j++){ if(bit[0][j]==0&&bit[1][j]==0){ bool ok=false; for(int k=j+1;k<63;k++){ if(bit[0][k]==1){ for(int l=k;l>j;l--){ bit[0][l]--; bit[1][l-1]=bit[0][l-1]=1; } ok=true; break; }else if(bit[1][k]==1){ for(int l=k;l>j;l--){ bit[1][l]--; bit[1][l-1]=bit[0][l-1]=1; } ok=true; break; } } } } int ret=0; for(int i=0;i<63;i++)ret+=bit[0][i]+bit[1][i]; printf("Case #%d: %d\n",T+1,ret); } }
Result 全部通って80位(ジャファルに始末されるレベル)
本選もこうだったら引退だと思う