2012/10/08

Codeforces Round #143(Div.2) 参戦記

できた回です。問題はこちら


A:文法の練習問題で、歴代最速提出をマークしました。各行に入る1,0の列のうち、1が2個以上ある列は幾つ有りますか?という問題ですね。

B:この問題のほうがDより難しいのではないのかな?という問題でした。数列の奇数項の総和-偶数項の総和をdにすればよいので、総和が適切な範囲に持ってこれるかどうかを考えて、配列に分配しました。

C:ソート+しゃくとり法です。昇順ソートした後、a[i]に揃えるために必要な和の回数及びその時揃えられる個数をしゃくとり法で計算すればOKです。

D:見掛け倒しです。見る位置と各面の位置関係を列挙するだけです。

oooo-,27位/2347人,4190点,レートは1516->1696でした。惜しくもDiv.1届かず!ですが、Div.1で戦える自信はないので、これでよかったのかもしれません。

[A,AC (C)]

#include<stdio.h>

int main(void){
  int n,count=0,a,b,c;
  scanf("%d",&n);
  while(n--){
    scanf("%d%d%d",&a,&b,&c);
    count+=(a+b+c)/2;
  }
  printf("%d\n",count);
  return 0;
}



[B,AC (C)]

#include<stdio.h>

int main(void){
  int P,M,n,l,d;
  int i,j,k,tmpm,tmpp,flg;
  int array[100]={0};

  scanf("%d%d%d",&n,&d,&l);

  tmpp=(n+1)/2*l;
  tmpm=n/2*l;
  for(M=n/2,flg=0;M<=tmpm;M++){
    P=M+d;
    if(P>=(n+1)/2 && P<=tmpp){
      flg=1;
      break;
    }
  }
  if(flg==0){
    puts("-1");
    return 0;
  }

  tmpp/=l;
  tmpm/=l;
  while(P!=0 || M!=0){
    for(i=0;i<n;i++){
      if(i%2){
if(M==0) continue;
M--;
array[i]++;
      }else{
if(P==0) continue;
P--;
array[i]++;
      }
    }
  }
  for(i=0;i<n;i++) printf("%d%c",array[i],(i==n-1)?'\n':' ');
  return 0;
}


[C,AC (C)]


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

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

int main(void){
  int n,k,i,j;
  long long num,maxnum,S,maxS,maxplace;
  int a[(int)1E+5];
  scanf("%d%d",&n,&k);

  for(i=0;i<n;i++) scanf("%d",a+i);
  qsort(a,n,sizeof(int),compare);

  num=maxnum=1;
  S=maxS=0;
  maxplace=0;
  for(i=1;i<n;i++){
    S+=(a[i]-a[i-1])*num;
    num++;
    while(S>k){
      num--;
      S-=a[i]-a[i-num];
    }

    if(maxnum<num){
      maxS=S;
      maxnum=num;
      maxplace=i;
    }
  }
  printf("%d %d\n",(int)maxnum,(int)a[maxplace]);
  return 0;
}






[D,AC (C)]

#include<stdio.h>

int main(void){
  int x,y,z,x0,y0,z0;
  int a[6],*p=a-1;
  int i,j,k,num=0;

  scanf("%d%d%d",&x,&y,&z);
  scanf("%d%d%d",&x0,&y0,&z0);
  for(i=1;i<=6;i++) scanf("%d",p+i);
 
  if(y<0) num+=p[1];
  else if(y>y0) num+=p[2];

  if(z<0) num+=p[3];
  else if(z>z0) num+=p[4];

  if(x<0) num+=p[5];
  else if(x>x0) num+=p[6];

  printf("%d\n",num);
  return 0;
}

0 件のコメント:

コメントを投稿