2011/08/22

Codechef 2011 August Cook-off 参戦記

忘れていたので、最後の1時間だけ参加しました。


まず、"Open the Dragon Scroll"を解きました。一読してすぐにコードを書きました。大変シンプルで、10分で解けてしまいました。

次いで"Vote for the Noodle Soup"にとりかかりました。今年のMay cook-offの"Popular Rice Recipe"と似たような問題に思えましたが、少し違っていました。最初、最大値を取るだけかと思いましたが、+3と-2があったとき、答えは4という反例を見つけました。再度考えなおして、35分かけて正解でした。

他の問題は自分には難しすぎると思いましたのでやめました。

成績は2/5、順位は140位でした。レートは1051.821->1137.42と変化し、総合順位は269位になりました。

今回1位のlaycurseさん、おめでとうございます。また、ソース参考にさせていただきます。
[Open the Dragon Scroll]
#include<stdio.h>

int main(void){
  unsigned int n,a,b,p;
  unsigned int count;
  unsigned int out;
  unsigned int i;
  scanf("%u",&p);
  while(p--){
    scanf("%u %u %u",&n,&a,&b);
    count=0;
    out=0;
    for(i=0;i<n;i++) count+=((a>>i)&1)+((b>>i)&1);
    if(count>n) count-=2*(count-n);
    for(i=0;i<count;i++) out+=(1<<n-i-1);
    printf("%u\n",out);
  }
  return 0;
}

[Vote for the Noodle Soup]
#include<stdio.h>
#include<stdlib.h>

int main(void){
  int vote[1000];
  char pm;
  int input;
  unsigned int n;
  unsigned int i;
  unsigned int count;

  while(scanf("%u%*c",&n) && n){
    count=0;
    for(i=0;i<n;i++){
      scanf("%c %d%*c",&pm,&input);
      input+=(pm=='P')?-1:1;
      vote[i]=input;
    }
    for(i=0;i<n;i++){
      if(count<abs(vote[i])){
count=abs(vote[i]);
      }else{
if(abs(vote[i])%2==count%2) continue;
count++;
      }
    }
    printf("%u\n",count);
  }
  return 0;
}

0 件のコメント:

コメントを投稿