読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.216 FAC

問題はこちら
No.216 FAC - yukicoder

K君を0番の人だと思えば、各番号の人の得点を求めて、0番の人の点より大きな点の人がいるかを調べれば良い

int main(){
	int a[101]={},b[101]={},i,n,k,s=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",a+i);
	for(i=0;i<n;i++){
		scanf("%d",&k);
		b[k]+=a[i];
	}
	for(i=1;i<=100;i++)if(b[i]>b[0])s++;
	puts(s?"NO":"YES");
	return 0;
}

面倒だからまとめて同じ配列に読み込んじゃえ

a[202],b[101],i,k=101;
main(n){
	for(;~scanf("%d",a+i);i++);
	//a[1]~a[N]に得点が、a[N+1]~a[2N]に解いた人が保存されている
	//ループを抜けた時点でiは2*N+1になっている
	for(n=i/2;--i>n;b[a[i]]+=a[i-n]);
	//nにはNが保存され辻褄が合うようになっている
	for(;--k&&b[k]<=*b;);
	k=!puts(k?"NO":"YES");
}

ループ圧縮

for(;~scanf("%d",a+i);i++);for(n=i/2;--i>n;b[a[i]]+=a[i-n]);for(;--k&&b[k]<=*b;);
for(;~scanf("%d",a+i);i++);for(n=i/2;--i>n?b[a[i]]+=a[i-n]:--k&&b[k]<=*b;);
for(;~scanf("%d",a+i)?n=++i/2,1:--i>n?b[a[i]]+=a[i-n]:--k&&b[k]<=*b;);

bの大きさをごまかして

a[202],b[99],i,k=101;
main(n){
	for(;~scanf("%d",a+i)?n=++i/2,1:--i>n?b[a[i]]+=a[i-n]:--k&&b[k]<=*b;);
	k=!puts(k?"NO":"YES");
}

さらにkの終了条件をいじり、範囲外アクセスして

a[202],b[99],i,k=101;
main(n){
	for(;~scanf("%d",a+i)?n=++i/2,1:--i>n?b[a[i]]+=a[i-n]:b[--k]<=*b;);
	k=!puts(k>0?"NO":"YES");
}

121B