2011/11/04

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

久しぶりのCodeforces参戦記です。

まずはじめに、Aを解くことにしました。勘違いしてしまい、1WA。再提出して、00:08,Pretest Passed(-> System test Passed).

次にBを読みましたが、どうにもアルゴリズムが思いつきません。仕方がないのでCに移ります。しかし、Cもよく意味がわからない。そこで、Cと同じ配点だからとDに移りました。Dはよく意味がわかったので、方眼紙を出してきて考えました。正領域・負領域の問題であるように思ったので、上手く考えると実装は比較的楽でした。01:08にPretest Passed(-> System test Passed).

Eは解けそうになかったので、Cに戻って咀嚼します。理解したので、実際に組んでみるとなかなかうまくいきました。01:35にPretest Passed(-> System test Passed).

o-oo-,Score:3130,順位:26/1458,レーティングは1550->1666で、紫になりました。問題はこちらです。


[Prob.A(C,AC)]

#include<stdio.h>

int main(void){
  int n,a,b;
  scanf("%d %d %d",&n,&a,&b);
  printf("%d\n",n-a<=b+1?n-a:b+1);
  return 0;
}


[Prob.C(C,AC)]

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

int prime(int n);

int main(void){
  int chara[26],num_p=1;
  char str[1024],maxc;
  int i,j,k,l,max=0;
 
  memset(chara,0,sizeof(chara));
  scanf("%s",str);
  l=strlen(str);
  for(i=0;i<l;i++) chara[str[i]-'a']++;

  for(i=l/2;i<l;i++) num_p+=prime(i+1);
  for(i=0;i<26;i++){
    if(max<chara[i]){
      max=chara[i];
      maxc='a'+i;
    }
  }
  if(max<l-num_p){
    puts("NO");
    return 0;
  }
  puts("YES");
  for(i=1;i<=l;i++){
    if(i==1 || (prime(i)==1 && 2*i>l)){
      for(j=0;j<26;j++){
if(j==maxc-'a') continue;
if(chara[j]==0) continue;
putchar('a'+j);
chara[j]--;
break;
      }
      if(j==26){
putchar(maxc);
chara[maxc-'a']--;
      }
    }else{
      putchar(maxc);
      chara[maxc-'a']--;
    }
  }
  putchar('\n');
  return 0;
}

int prime(int n){
  int i;
  if(n!=2 && n%2==0) return 0;
  if(n==1) return 0;
  if(n==2) return 1;
  for(i=3;i<n/2;i+=2) if(n%i==0) return 0;
  return 1;
}


[Prob.D(C,AC)]

#include<stdio.h>
#define MAX(x,y) (((x)>(y))?(x):(y))
#define ABS(x) (((x)<0)?(-(x)):(x))

int getagroup(int x,int y,int num);
int getbgroup(int x,int y,int num);

int main(void){
  int a,b,x1,x2,y1,y2;
  int ga1,ga2,gb1,gb2;
  int difa,difb,ans;
  scanf("%d %d %d %d %d %d",&a,&b,&x1,&y1,&x2,&y2);
  ga1=getagroup(x1,y1,a);
  ga2=getagroup(x2,y2,a);
  gb1=getbgroup(x1,y1,b);
  gb2=getbgroup(x2,y2,b);
  difa=ABS(ga1-ga2);
  difb=ABS(gb1-gb2);
  ans=MAX(difa,difb);
  printf("%d\n",MAX(difa,difb));
  return 0;
}

int getagroup(int x,int y,int num){
  int n;
  n=x+y;
  if(n>=0) n/=(2*num);
  else{
    n/=(2*num);
    n--;
  }
  return n;
}

int getbgroup(int x,int y,int num){
  int n;
  n=x-y;
  if(n>=0) n/=(2*num);
  else{
    n/=(2*num);
    n--;
  }
  return n;
}
 

0 件のコメント:

コメントを投稿