2011年3月24日木曜日

Codeforces Beta Round #63 (div.2) 参戦記

CodeforcesのRound #63に参戦してきました。

まずざっと問題を読むのですが、英語なので理解が進まない。ProblemAからやろうと思って、すぐに読んでしまい、あまり簡単だったので他の問題を読む前にさっと完成。ここまで7分弱。

あとはB,C,D,Eと問題を読んだのですが、ぱっと読んでもよくわからない…。そうこうしているうちに30分少々経過し、何とかBの題意をつかんだので、丁寧に組み上げる。組み終わって1時間弱。

C,D,Eのうち、一番意味がわかりそうだったのがEだったので、Eの意味を丁寧に理解。理解するのに20分かかりましたが、何とか理解して作成、1時間40分頃完成しました。

ここでA,Bをロックしてハックに移ろうと思ったのですが、私のEがハックされたという知らせ。見てみると「時間かかりすぎ」のハック結果が・・・。まぁ、効率が悪い組み方に鳴っているからですね。とはいっても、残りの20分で組み直せるような気もしなかったので、ひとまず放っておき、ハックに向かいました。

C++の人が多いのですが、まだまだC++は読めず、結局ハックはone missのみで終わりました。

次回のRound#64は3/27AM1:00〜。楽しくやってみようかと思います。
問題はこちらです。
また、私の解答例ソース(C)を載せておきます。恥ずかしいですが…。




A.Young Physicist


#include<stdio.h>

int main(void){
  int force[3],sum[3]={0,0,0};
  int i,n,j;
  scanf("%d",&n);
  for(i=0;i<n;i++){
    scanf("%d %d %d",&force[0],&force[1],&force[2]);
    for(j=0;j<3;j++) sum[j]+=force[j];
  }

  if(sum[0]*sum[0]+sum[1]*sum[1]+sum[2]*sum[2]==0) puts("YES");
  else puts("NO");
  return 0;
}




B.Bets


#include<stdio.h>

#define NUM 100

typedef struct{
  int st;
  int go;
  int t;
  int c;
}runner;


int main(void){
  int i,j,k,n,m;
  runner per[NUM],max;
  int profit=0,maximum,flg;

  scanf("%d %d",&m,&n);
  for(i=0;i<n;i++)
    scanf("%d %d %d %d",&per[i].st,&per[i].go,&per[i].t,&per[i].c);
  for(i=1;i<=m;i++){
    maximum=0;
    flg=0;
    for(j=0;j<n;j++){
      if(i>=per[j].st && i<=per[j].go){
        if(flg==0){
          flg=1;
          max=per[j];
          maximum=max.c;
        }else if(max.t>per[j].t){
          max=per[j];
          maximum=max.c;
        }
      }
    }
    profit+=maximum;
  }
  printf("%d\n",profit);
  return 0;      
}



E.Subsegments


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

int comp(const void *p1, const void *p2){
  int n1,n2;
  n1=*((const int *)p1);
  n2=*((const int *)p2);
  return n2-n1;
}


int main(void){
  int n,k;
  int i,j;
  int *array,*sub,tmp,flg;
  scanf("%d %d",&n,&k);

  array=(int *)calloc(n,sizeof(int));
  sub=(int *)calloc(k,sizeof(int));
  for(i=0;i<n;i++) scanf("%d",array+i);
 
  for(i=0;i<=n-k;i++){
    for(j=0;j<k;j++) *(sub+j)=*(array+i+j);  
    qsort(sub,k,sizeof(int),comp);
    for(flg=0,tmp=sub[0],j=1;j<k;j++){
      if(tmp==sub[j]){
        flg=1;
        if(j==k-1){
          printf("Nothing\n");
          break;
        }
        continue;
      }else{
        if(flg==0){
          printf("%d\n",tmp);
          break;
        }else{
          tmp=sub[j];
          flg=0;
          if(j==k-1){
            printf("%d\n",tmp);
            break;
          }
          continue;
        }
      }
    }
  }
  free(sub);
  free(array);
  return 0;
}

0 件のコメント: