おなじみの参戦記です。
開始。万全の状態で、なにか後に控えていることもなく、気持よく参戦。
解き始めて、7分。まずはA問題をPretest Passedでした。
丁寧に考えて、計算回数が増えないように丁寧に組みなおして、32分でB問題Pretest Passedです。万全です。
その後C問題にとりかかりますが、ぱっと見ではやや難しいですが、丁寧に考えていきます。いろいろなケースを紙に書いて、じっくりと解いていきます。走行していくうちに、解き方が見えてきました。無事に解いて、ちょうど1時間でPretest Passed!です。
その後のD-E問題はとく気になりませんでしたし、また、hackにも取り組みましたが、なぜかなかなか表示されず、腹がたったので途中でやめて寝てしまいました。
朝起きてから確認すると、3問ともAcceptedで、2498点、39位/896人でした。そして、青くなることができました!嬉しい限りです♪
では、いつも通りソースです。
A:単純に計算するだけです。
#include<stdio.h>
int main(void){
unsigned int r,g,b;
unsigned int r_t,g_t,b_t,max;
scanf("%u %u %u",&r,&g,&b);
r_t=27+3*((r+1)/2);
g_t=28+3*((g+1)/2);
b_t=29+3*((b+1)/2);
max=r_t;
if(max<g_t) max=g_t;
if(max<b_t) max=b_t;
printf("%u\n",max);
return 0;
}
B:全探索ですが、丁寧に組みます。
#include<stdio.h>
#include<string.h>
int main(void){
int m,n,i,j,k,f;
char tmp;
struct{
char c;
short flg;
} cross[100][100];
scanf("%d %d%c",&m,&n,&tmp);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%c",&cross[i][j].c);
cross[i][j].flg=0;
}
scanf("%c",&tmp);
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(cross[i][j].flg%2==0){
f=0;
for(k=0;k<n;k++){
if(k==j) continue;
if(cross[i][k].c==cross[i][j].c){
cross[i][k].flg+=1;
f=1;
}
}
if(f==1) cross[i][j].flg++;
}
if(cross[i][j].flg/2==0){
f=0;
for(k=0;k<m;k++){
if(i==k) continue;
if(cross[k][j].c==cross[i][j].c){
cross[k][j].flg+=2;
f=1;
}
}
if(f==1) cross[i][j].flg+=2;
}
}
}
for(i=0;i<m;i++) for(j=0;j<n;j++) if(cross[i][j].flg==0) putchar(cross[i][j].c);
putchar('\n');
return 0;
}
C:よく考えると、数は計算で出せることがわかります。
#include<stdio.h>
#include<stdlib.h>
#define MIN(x,y) ((x<y)?(x):(y))
int main(void){
unsigned int n,m,k;
unsigned int i,j;
unsigned int *cell;
unsigned int min=100001;
scanf("%u %u %u",&n,&m,&k);
if(n%2==0 || (n+1)/2>m){
for(i=0;i<n;i++) scanf("%u",&j);
puts("0");
return 0;
}
cell=(unsigned int *)calloc(n,sizeof(unsigned int));
for(i=0;i<n;i++) scanf("%u",cell+i);
for(i=0;i<n;i+=2) if(min>*(cell+i)) min=*(cell+i);
m/=(n+1)/2;
printf("%u\n",MIN(min,m*k));
free(cell);
return 0;
}
0 件のコメント:
コメントを投稿