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