2011/08/04

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

少し悔しいRoundでした。

開始後、Aを理解するのに時間がかかります。何度か読み間違えたのですが、0:24にPretest Passed。

BとCはただコードを打つだけの問題でした。Bは0:39、Cは0:57にPretest Passed.

Eも解くことができました。1:33にPretest Passedです。ただし、この解答自体はオーバーフローを起こしてしまいました。下のソースは、64bit整数を使ったものです。

Eのアルゴリズムは次のようになります。
ベクトルA,B,Cを複素数とみなします。この時、与えられた操作によって出来るベクトルは
i(i(i(i…(i(A+n1C)+n2C)+n3C)+…)+nkC
となります。これを展開して、i^2=-1に注意すると
(i^m)A+NC+iN'C
となります。(m=0,1,2,3)
これがBと等しいので、
B-(i^m)A=CN+iCN'
となります。これを解いて、N,N'を求め、それが整数ならばYES、そうでなければNOです。

結果:2404,216/1015でした。少し易し目のラウンドだったようです。

[A]

#include<stdio.h>
#include<string.h>
#define NUM 100

int main(void){
  int m,n;
  int price[NUM];
  int i,j,k,l;
  int min=-1;
  short match[NUM][NUM];
  memset(match,-1,sizeof(match));
  scanf("%d %d",&n,&m);
  for(i=0;i<n;i++) scanf("%d",&price[i]);
  for(i=0;i<m;i++){
    scanf("%d %d",&j,&k);
    match[j-1][k-1]=1;
    match[k-1][j-1]=1;
  }
  for(i=1;i<=n;i++){
    for(j=i+1;j<=n;j++){
      if(match[i-1][j-1]<0) continue;
      for(k=j+1;k<=n;k++){
if(match[j-1][k-1]<0) continue;
if(match[i-1][k-1]<0) continue;
if(min<0 || min>price[i-1]+price[j-1]+price[k-1]) min=price[i-1]+price[j-1]+price[k-1];
      }
    }
  }
  printf("%d\n",min);
  return 0;
}



[B]

#include<stdio.h>
#include<string.h>
#define LENGTH 100001

int main(void){
  int count[10];
  char num[LENGTH];
  int i,j,k,l,times=0,sum;
  scanf("%s",num);
  for(i=0;i<10;i++) count[i]=0;
  l=strlen(num);
  if(l==1){
    puts("0");
    return 0;
  }

  for(i=0;i<l;i++) count[num[i]-'0']++;
  times=1;
  while(1){
    for(i=0,k=0;i<10;i++) k+=count[i];
    if(k<=1) break;
    for(i=0,sum=0;i<10;i++) sum+=i*count[i];
    sprintf(num,"%d\0",sum);
    l=strlen(num);
    for(i=0;i<10;i++) count[i]=0;
    for(i=0;i<l;i++) count[num[i]-'0']++;
    times++;
  }
  printf("%d\n",times-1);
  return 0;
}




[C]

#include<stdio.h>
#include<string.h>

#define LEN 100001

int main(void){
  char str[LEN],out[LEN];
  int m,n,i,j,k,l,min,minch;
  int count[26],c=0;
  memset(count,0,sizeof(count));
  scanf("%s%*c",str);
  scanf("%d",&k);
  l=strlen(str);
  for(i=0;i<l;i++) count[str[i]-'a']++;

  while(1){
    min=LEN;
    for(i=0;i<26;i++){
      if(count[i]==0) continue;
      if(min>count[i]){
min=count[i];
minch=i;
      }
    }
    if(k<min || min==LEN) break;
    k-=min;
    count[minch]=0;
  }
  for(i=0;i<26;i++) c+=(count[i]!=0);
 
  for(i=0,j=0;i<l;i++){
    if(count[str[i]-'a']==0) continue;
    out[j++]=str[i];
  }
  out[j]='\0';
  printf("%d\n",c);
  puts(out);
  return 0;
}



[E]

#include<stdio.h>

int answer(long long int  bx,long long int  by,long long int  cx,long long int  cy);

int main(void){
  struct vector{
    long long int  x;
    long long int  y;
  }a,b,c,d;
  int flg,j,k;
 
  scanf("%I64d %I64d",&a.x,&a.y);
  scanf("%I64d %I64d",&b.x,&b.y);
  scanf("%I64d %I64d",&c.x,&c.y);

  flg=0;
  flg+=answer(b.x-a.x,b.y-a.y,c.x,c.y);
  flg+=answer(b.x+a.y,b.y-a.x,c.x,c.y);
  flg+=answer(b.x+a.x,b.y+a.y,c.x,c.y);
  flg+=answer(b.x-a.y,b.y+a.x,c.x,c.y);

  if(flg==0) puts("NO");
  else puts("YES");
  return 0;
}

int answer(long long int  bx,long long int  by,long long int  cx,long long int  cy){
  long long int  tmp;
  if(cx==0 && cy==0){
    if(bx==0 && by==0) return 1;
    return 0;
  }
  if(cx==0){
    if(bx%cy==0 && by%cy==0) return 1;
    return 0;
  }else if(cy==0){
    if(bx%cx==0 && by%cx==0) return 1;
    return 0;
  }else{
    tmp=cx*cx+cy*cy;
    if((bx*cx+by*cy)%tmp==0 && (by*cx-bx*cy)%tmp==0) return 1;
    return 0;
  }
  return 0;
}

0 件のコメント:

コメントを投稿