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 件のコメント:
コメントを投稿