2011/08/08

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

4問提出して、2問しか正答できない、悪い成績の回でした。幸い、まだ青いままです。

A: switch文を用いて答えを列挙しました。というのは、せいぜい25種類しか入力がないからです。提出して、Pretest Passedが0:05でした。

B: コンテストの前に仕事があって疲れていたので、問題に集中できませんでした。おかげで、理解するのに時間がかかってしまいましたが、計算方法を考えて、0:25にsubmit/pretest passed。

E: 単に数列の部分和を計算するだけの問題で、高速化のしようがないのでは?と思ってしまいました。良いアルゴリズムは得られず、TLEでした(1:20)。

D: 問題文の意味がわからなかったので、入出力例から推測して作ってみたところ、なんとPretest Passed!(1:54) もちろん、Wrong Answerでしたが。 

結果、1398,310位/1093人でした。問題はこちら

今回はDiv.1 A=Div.2 B,1B=2C,1C=2D,1D=2Eと、少し難しかったように感じます。
A
#include<stdio.h>

int main(void){
  int n,k;
  scanf("%d",&n);
  switch(n){
  case 11:
  case 12:
  case 13:
  case 14:
  case 15:
  case 16:
  case 17:
  case 18:
  case 19:
  case 21:
    k=4;
    break;
  case 20:
    k=15;
    break;
  default:
    k=0;
  }
  printf("%d\n",k);
  return 0;
}


B
#include<stdio.h>

int main(void){
  unsigned long long int n,sum=0,i,in;
  scanf("%I64u",&n);
  for(i=1;i<=n;i++){
    scanf("%I64u",&in);
    sum+=i*in-(i-1);
  }
  printf("%I64u\n",sum);
  return 0;
}



D(Wrong)
#include<stdio.h>
int main(void){
  unsigned long long int p,k,n,x;
  int flg;
  scanf("%I64u %I64u %I64u",&n,&k,&p);
  flg=n%2;
  if(flg==0 && 2*k>n) flg=2;
  while(p--){
    scanf("%I64u",&x);
    if(flg==0){
      if(x%2==0 && (n-x)/2+1<=k) putchar('X');
      else putchar('.');
    }else if(flg==1){
      if(x<=n-k) putchar('.');
      else putchar('X');
    }else{
      if(x%2==0) putchar('X');
      else if((n-x)/2+1<=k-n/2) putchar('X');
      else putchar('.');
    }
  }
  putchar('\n');
  return 0;
}


E(TLE)
#include<stdio.h>
#include<stdlib.h>

int main(void){
  unsigned int n,a,b,*w,p,i,j;
  unsigned long long int sum,allsum=0;
  scanf("%u",&n);
  w=(unsigned int *)calloc(n,sizeof(unsigned int));
  for(i=0;i<n;i++){
    scanf("%u",w+i);
    allsum+=*(w+i);
  }
  scanf("%u",&p);
  while(p--){
    scanf("%u %u",&a,&b);
    if(((n-a)/b+1)*2<=n){
      sum=0;
      for(i=a-1;i<n;i+=b) sum+=*(w+i);
    }else{
      sum=allsum;
      for(i=0;i<a-1;i++) sum-=*(w+i);
      for(i=a-1;i<n;i+=b) for(j=1;j<b;j++) sum-=*(w+i+j);
    }
    printf("%I64u\n",sum);
  }
  free(w);
  return 0;
}

0 件のコメント:

コメントを投稿