tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

Google Code Jam Japan 予選

死んだ、もう引退、とか思ったけど(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位(ジャファルに始末されるレベル)

本選もこうだったら引退だと思う