まずはじめに、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 件のコメント:
コメントを投稿