2011年6月5日日曜日

UAPC2011/IPSC2011 参戦記

6月5日はUAPC2011/IPSC2011の両方が行われる日でした。両方共フル参加すれば楽しいのでしょうか、いろいろ立て込んでいましたので、UAPCは2時半から4時半、IPSCは7時から9時までの時間限定で参加しました。他の時間は、テスト勉強等で忙しくしていました。

今回色々読みましたが、テスト勉強できもそぞろだったからか、どちらも解けたのは一問目だけでした。もう少し落ち着いて大会に出たいものです。一息付ける時期がきたらSuperconの問題を解かないと…。

UAPCの第1問(A)は初心者の練習問題にも出来る問題で、ifを用いて丁寧に書けば書くことができました。

一方で、IPSCの第1問(A)はそれなりの問題でした。ジャンケンに似たゲームの問題です。私は一種のバックトラックで書きましたが、もっと効率的な解法があったのでしょうか。

UAPCはこちら、IPSCはこちらです。

UAPC-(A)

#include<stdio.h>
typedef unsigned int u_int;

int main(void){
  u_int lunch=0,din=0,mid=0;
  u_int al,ad,am;
  u_int hh,mm,min,tmp;
  u_int n,i,j;
  while(scanf("%u",&n) && n){
    lunch=din=mid=0;
    al=ad=am=0;
    for(i=0;i<n;i++){
      scanf("%u:%u %u",&hh,&mm,&min);
      if(hh>=11 && hh<=14) al++;
      else if(hh>=18 && hh<=20) ad++;
      else  if(hh>=21 || hh<=1) am++;
      tmp=(mm>min)?min+60-mm:min-mm;
      if(tmp>8) continue;
      if(hh>=11 && hh<=14) lunch++;
      else if(hh>=18 && hh<=20) din++;
      else if(hh>=21 || hh<=1) mid++;
    }
    printf("lunch ");
    if(al==0) puts("no guest");
    else printf("%u\n",lunch*100/al);
    printf("dinner ");
    if(ad==0) puts("no guest");
    else printf("%u\n",din*100/ad);
    printf("midnight ");
    if(am==0) puts("no guest");
    else printf("%u\n",mid*100/am);
  }
  return 0;
}



IPSC-(A)

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

void makehands(unsigned short *a,unsigned short *b,unsigned int i);
void printhands(unsigned short *a);

int main(void){
  unsigned short *hands,*mine;
  unsigned int r,m,n,i,j,k;
  char string[10],c;
 
  scanf("%u%c",&r,&c);
  hands=(unsigned short *)calloc(r,sizeof(unsigned short));
  mine=(unsigned short *)calloc(r,sizeof(unsigned short));
  for(i=0;i<r;i++){
    fgets(string,sizeof(string)/sizeof(char),stdin);
    switch(string[0]){
    case 'r':
      *(hands+i)=1;
      break;
    case 'p':
      *(hands+i)=2;
      break;
    case 's':
      *(hands+i)=3;
      break;
    case 'l':
      *(hands+i)=4;
      break;
    case 'S':
      *(hands+i)=5;
      break;
    }
  }
  for(i=0;i<r;i++) makehands(hands+i,mine+i,i);
  for(i=0;i<r;i++) printhands(mine+i);
  free(hands);
  free(mine);
}

void makehands(unsigned short *a,unsigned short *b,unsigned int i){
  switch(*a){
  case 1:
    if(*b==5) *b=2;
    else *b=5;
    break;
  case 2:
    if(*b==4) *b=3;
    else *b=4;
    break;
  case 3:
    if(*b==1) *b=5;
    else *b=1;
    break;
  case 4:
    if(*b==3) *b=1;
    else *b=3;
    break;
  case 5:
    if(*b==2) *b=4;
    else *b=2;
    break;
  }
  if(i!=0 && *(b-1)==*b) makehands(a-1,b-1,i-1);
  return;
}
void printhands(unsigned short *a){
  switch(*a){
  case 1:
    puts("rock");
    break;
  case 2:
    puts("paper");
    break;
  case 3:
    puts("scissors");
    break;
  case 4:
    puts("lizard");
    break;
  case 5:
    puts("Spock");
    break;
  }
}

0 件のコメント: