2011年6月8日水曜日

Codeforces Beta Round #73(Div.2) 参戦記

ちょっと疲れていたので、ゆっくりする感じで参加。

問題Aを読み、解きます。ギターのコードの問題。普通に解きましたが、だいぶゆっくりだったため、解き終わったのは36分。

次いで問題B。方針はあっていると思うのですが、すごく汚いコード。WAでしたが、Pretest1とのこと。しかし、どの入力例に対しても、ローカルでは正しく出力しています。何が悪いのかがわからない…。もしわかる方がいらしたら教えてください。仕方ないので、問題Cに移ります。

問題Cは比較的好きな漸化式の問題。先にこちらを溶いておいたらよかったと思いましたが後の祭り。問題Bを諦めたのが残り20分で、コーディング間に合わず、結局問題Aしか解けませんでした。

順位は361/946で、得点は428でした。今ひとつです。最近ちょっと下降線なので、少し上げていきたいですね。問題はこちら
いつも通りコードを公開します。Cは採点された後に動作確認をして打ちなおしたものです。
A:解けます。

#include<stdio.h>
#include<string.h>

short codenum(char *str);
void swap(short *a,short *b);

int main(void){
  short code[3],dis[3];
  char str[3][3];
  int i;
 
  scanf("%s %s %s",str[0],str[1],str[2]);
  for(i=0;i<3;i++) code[i]=codenum(str[i]);
  if(code[0]>code[1]) swap(&code[0],&code[1]);
  if(code[1]>code[2]) swap(&code[2],&code[1]);
  if(code[0]>code[1]) swap(&code[0],&code[1]);

  for(i=0;i<3;i++){
    dis[i]=code[(i+1)%3]-code[i];
    if(dis[i]<0) dis[i]+=12;
  }
  if(dis[0]==4 && dis[1]==3) puts("major");
  else if(dis[1]==4 && dis[2]==3) puts("major");
  else if(dis[2]==4 && dis[0]==3) puts("major");
  else if(dis[0]==3 && dis[1]==4) puts("minor");
  else if(dis[1]==3 && dis[2]==4) puts("minor");
  else if(dis[2]==3 && dis[0]==4) puts("minor");
  else puts("strange");
  return 0;
}

short codenum(char *str){
  short tmp;
  switch(*(str+0)){
  case 'C':
    tmp=0;
    break;
  case 'D':
    tmp=2;
    break;
  case 'E':
    tmp=4;
    break;
  case 'F':
    tmp=5;
    break;
  case 'G':
    tmp=7;
    break;
  case 'A':
    tmp=9;
    break;
  case 'B':
    tmp=10;
    break;
  case 'H':
    tmp=11;
    break;
  }
  if(*(str+1)=='#') tmp++;
  return tmp;
}

void swap(short *a,short *b){
  short tmp;
  tmp=*a;
  *a=*b;
  *b=tmp;
}

B:ローカル環境でやればうまくいきますが、向こうではうまくいきません。どなたか、原因をご教示いただければ幸いです。

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>

int charcode(char c){
  return c-'A';
}

int main(void){
  short can[26];
  char *str,**key;
  int count=0,i,j,k,l;
  int m,n,x,q;
  int code,dis;
 
  memset(can,-1,sizeof(can));
  scanf("%d %d %d",&m,&n,&x);
  key=(char **)calloc(m,sizeof(char *));
  for(i=0;i<m;i++) *(key+i)=(char *)calloc(n+1,sizeof(char));
  for(i=0;i<m;i++) scanf("%s",*(key+i));
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      if(*(*(key+i)+j)=='S') continue;
      code=charcode(toupper(*(*(key+i)+j)));
      if(can[code]==0) continue;
      if(can[code]>=0) can[code]=-2;
      for(k=0;k<m;k++){
for(l=0;l<n;l++){
 if(*(*(key+k)+l)!='S') continue;
 can[code]=1;
 if((k-i)*(k-i)+(l-j)*(l-j)>=x*x) continue;
 can[code]=0;
 break;
}
if(can[code]==0) break;
      }
    }
  }
  rewind(stdin);
  scanf("%d",&q);
  str=(char *)calloc(q+1,sizeof(char));
  scanf("%s",str);
  for(i=0;i<q;i++){
    if(isupper(*(str+i))==0){
code=charcode((char)toupper(*(str+i)));
if(can[code]==-1){
 puts("-1");
 for(i=0;i<m;i++) free(*(key+i));
 free(key);
 free(str);
 return 0;
}
continue;
    }
    code=charcode(*(str+i));
    if(can[code]==-2){
      puts("-1");
      for(i=0;i<m;i++) free(*(key+i));
      free(key);
      free(str);
      return 0;
    }
    count+=can[code];
  }
  printf("%d\n",count);
  for(i=0;i<m;i++) free(*(key+i));
  free(key);
  free(str);
  return 0;
}



C:あまり綺麗なコードではありませんが、もう少し時間をかければ解けたはずです。悔しい。

#include<stdio.h>

typedef unsigned int u_int;

int main(void){
  u_int a,b;
  u_int i,j;
  u_int an;
  unsigned long long int counta=0,countb=0;
  scanf("%u %u",&a,&b);
  if(a>b){
    an=a%b;
    while(an!=0){
      counta+=an;
      countb+=a-an;
      an=(an+a)%b;
    }
    counta+=b;
    countb+=a-b;
    if(counta>countb) puts("Dasha");
    else if(counta==countb) puts("Equal");
    else puts("Masha");
  }else{
    b+=a;
    a=b-a;
    b-=a;
   an=a%b;
   while(an!=0){
      counta+=an;
      countb+=a-an;
      an=(an+a)%b;
    }
    counta+=b;
    countb+=a-b;
    if(counta>countb) puts("Masha");
    else if(counta==countb) puts("Equal");
    else puts("Dasha");
  }
  return 0;

}



0 件のコメント: