結果は…
公式速報値で310/500点(100+100+100+10+0)
※速報値です。正式発表ではありません。
Aランクワンチャンあるか…どうだろう…あってほしい…
310点/500、Aランクで確定しました!
とりあえずソースコードを晒してみます。コメントくれると嬉しいな。
問題1
► スポイラーを表示
#include
/*
status
0: start
1: inputting J
2: inputting O
3: inputting I
*/
int main(void) {
int mozi;
int status=0;
int currentrenzoku=0;
int jrenzoku=0;
int orenzoku=0;
int maxlebel=0;
while(1) {
mozi=getchar();
if(mozi==EOF || mozi=='\n')break;
switch(mozi) {
case 'J':
if(status==1) {
currentrenzoku++;
} else {
status=1;
currentrenzoku=1;
}
break;
case 'O':
if(status==1) {
jrenzoku=currentrenzoku;
currentrenzoku=1;
status=2;
} else if(status==2) {
currentrenzoku++;
} else {
status=0;
currentrenzoku=0;
}
break;
case 'I':
if(status==2) {
orenzoku=currentrenzoku;
currentrenzoku=1;
status=3;
if(jrenzoku>=1 && orenzoku==1) {
if(maxlebel=currentrenzoku && orenzoku==currentrenzoku) {
if(maxlebel
/*[which card][for multiple cards of the same number]*/
int acl[1001][5000];
int acl_num[1001];
int acl_used[1001];
int main(void) {
int b_cards[5000];
int num_a,num_b;
int start;
int i,j;
int currentcard;
int currentpos=-1;
int currentscore=0;
int maxscore=0;
int ok;
scanf("%d%d",&num_a,&num_b);
for(i=0;i0) {
if(acl[currentcard][acl_used[currentcard]]>currentpos) {
ok=1;
break;
}
acl_used[currentcard]++;
}
if(ok) {
currentpos=acl[currentcard][acl_used[currentcard]];
acl_used[currentcard]++;
currentscore++;
} else {
break;
}
}
if(currentscore>maxscore)maxscore=currentscore;
}
printf("%d\n",maxscore);
return 0;
}
問題3
► スポイラーを表示
#include
int memo[3000][3001];
int tanosisa[3000];
int zikan[3000];
int tansaku(int yomisemax,int hanabi,int timemax,int nextyomise,int ctime);
int main(void) {
int yomisenum;
int hanabitime,endtime;
int i;
int result;
scanf("%d%d%d",&yomisenum,&endtime,&hanabitime);
for(i=0;i=yomisemax)return 0;
if(memo[nextyomise][ctime]>0)return memo[nextyomise][ctime]-1;
/*don't play*/
result=tansaku(yomisemax,hanabi,timemax,nextyomise+1,ctime);
/*play*/
nexttime=ctime;
if(nexttimehanabi)nexttime=hanabi;
nexttime+=zikan[nextyomise];
if(nexttimeresult)result=nowresult;
}
memo[nextyomise][ctime]=result+1;
return result;
}
番号の小さい順に遊ぶという条件を忘れていて最初詰んだ。
メモ化探索なのにメモをしていなかった。
アクセス違反で不正解をもらった。
最終的に満点を取れたのでよかった。
問題4
► スポイラーを表示
#include
char flag[5000][5000];
int main(void) {
int N,M;
int a,b,x;
int i,j,k;
int count=0;
scanf("%d%d",&N,&M);
for(i=0;i
#include
int visited[100000];
int dist_omaturi[100000];
int douro_list_start[100001];
typedef struct {
int from;
int to;
int length;
} douro_t;
douro_t douro_list[400000];
int qsort_comp(const void* x,const void* y) {
const douro_t* a=(const douro_t*)x;
const douro_t* b=(const douro_t*)y;
if((a->from)>(b->from))return 1;
if((a->from)from))return -1;
if((a->to)>(b->to))return 1;
if((a->to)to))return -1;
return 0;
}
int tansaku(int nowtown,int disttown);
int main(void) {
int townnum,douronum,festnum,querynum;
int i,j,k;
int from,to,length;
int omaturi;
int mindist,minpos;
int nowmindist,nowdist;
int start,end;
scanf("%d%d%d%d",&townnum,&douronum,&festnum,&querynum);
for(i=0;i=0) {
mindist=0x7fffffff;minpos=-1;
for(j=0;j=0) {
nowdist=dist_omaturi[douro_list[k].to]+douro_list[k].length;
if(nowdist=0)dist_omaturi[minpos]=mindist;
}
/*calc about the route*/
for(i=0;i=0) {
found=1;
if(nowdist>maxdist)maxdist=nowdist;
}
}
}
visited[nowtown]=0;
if(maxdist>dist_omaturi[nowtown])maxdist=dist_omaturi[nowtown];
return found?maxdist:-1;
}
そのあと単純な再帰で調べたら死んだ。
例が通ったので油断した。
まとめ
まあ、こんなもんだろう。
前々回16点/100→前回24点/100と比べると素点は大幅に上がったようです。
しかし、みんな[要出典]簡単だったと言っているからなあ…
過去の大会での本選のAランクの基準点の最高は58点。
さあ、どうなることやら…