2011年6月17日金曜日

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

おなじみの参戦記です。

開始。万全の状態で、なにか後に控えていることもなく、気持よく参戦。
解き始めて、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 件のコメント: