問題はこちら
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