みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

情報オリンピック予選

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

情報オリンピック予選

投稿記事 by みけCAT » 14年前

昨日の情報オリンピック予選に参加してました。
ここのメンバーで他にも参加した人っているのかな?
[hr]
前回の予選では、最初こそ極端に重かったけれど、しばらくしたら快適になったようでした。
しかし、今回は、ずっと重かったようです。
対策はしたようなのに、どうしてでしょうか。
[hr]
というわけで書いたソースです。
問題はこちら。http://www.ioi-jp.org/joi/2010/2011-yo-prob_and_sol/
一問目

CODE:

#include 

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	int byouone,byousum;
	int i;
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	byousum=0;
	for(i=0;i

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	char searchfor[11];
	int ringnum;
	int i;
	int count;
	char ring[11];
	char ringbuf[21];
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	fscanf(in,"%s",searchfor);
	fscanf(in,"%d",&ringnum);
	count=0;
	for(i=0;i

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	int n,k;
	int x,y;
	int i;
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	fscanf(in,"%d",&n);
	fscanf(in,"%d",&k);
	for(i=0;in)x=n-x+1;
		if(y*2>n)y=n-y+1;
		if(x>y)fprintf(out,"%d\n",(y-1)%3+1);
		else fprintf(out,"%d\n",(x-1)%3+1);
	}
	/*file close*/
	fclose(in);
	fclose(out);
	return 0;
}
この図形って線対称じゃないか。ということは左上に移動させて判定すればよい。

四問目

CODE:

#include 

unsigned long long kazu[100][21];
unsigned long long kazoe(int*,int,int,int);

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	int suuzi[100];
	int kosuu;
	unsigned long long count;
	int i,j;
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	fscanf(in,"%d",&kosuu);
	for(i=0;i=0 && nowsuuzi=0 && nowsuuzi
#include 

int go(int,int,int,int,int,int,char[1000][1001]);

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	int h,w;
	int n;
	char map[1000][1001];
	int factpos[10][2];
	int x,y;
	int i;
	int timesum;
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	fscanf(in,"%d %d %d",&h,&w,&n);
	for(i=0;i='1' && map[y][x]0 && zikan[y*1000+x-1]>0)saitan=zikan[y*1000+x-1];
					if(y>0 && zikan[(y-1)*1000+x]>0) {
						if(zikan[(y-1)*1000+x]0) {
						if(zikan[y*1000+x+1]0) {
						if(zikan[(y+1)*1000+x]-1) {
						zikan[y*1000+x]=saitan+1;
						if(y==dy && x==dx) {
							free(zikan);
							return saitan;
						}
					}
				}
			}
		}
	}
}
一つ一つ順番に移動していけばいい。ん?O(n^3)!?ギャーーー!!

六問目

CODE:

#include 

int go(int,int,int,int,char[20][21],int);

int main(int argc,char* argv[]) {
	char infile[255],outfile[255];
	FILE* in;
	FILE* out;
	/*declare values*/
	int m,n;
	char flag[20][21];
	int i;
	/*open files*/
	sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
	sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
	in=fopen(infile,"r");
	if(in==NULL)return 1;
	out=fopen(outfile,"w");
	if(out==NULL) {
		fclose(in);
		return 1;
	}
	/*do work*/
	fscanf(in,"%d %d",&m,&n);
	for(i=0;i=sx) {
		nx-=sx;
		ny++;
	}
	if(ok) {
		if(ny<sy)sum+=go(nx,ny,sx,sy,flag,1); else {
			if(flag[y][x]=='?')sum+=3; else sum++;
		}
	} else {
		if(flag[y][x]=='?') {
			for(i=0;i<3;i++) {
				ok=0;
				flag[y][x]=m[i];
				for(yy=0;yy<sy-1;yy++) {
					for(xx=0;xx<sx-1;xx++) {
						if(flag[yy][xx]=='J' && flag[yy][xx+1]=='O'
							&& flag[yy+1][xx]=='I') {
								ok=1;goto out;
						}
					}
				}
				out:
				if(ny<sy)sum+=go(nx,ny,sx,sy,flag,ok);
				else
					if(ok)sum++;
			}
			flag[y][x]='?';
		} else {
			for(yy=0;yy<sy-1;yy++) {
				for(xx=0;xx<sx-1;xx++) {
					if(flag[yy][xx]=='J' && flag[yy][xx+1]=='O'
						&& flag[yy+1][xx]=='I') {
							ok=1;goto out2;
					}
				}
			}
			out2:
			if(ny<sy)sum+=go(nx,ny,sx,sy,flag,ok);
			else
				if(ok)sum++;
		}
	}
	return sum;
}
うわ!?何これ!?落ち着け!とりあえず総当たりで...あれ?間違ってる!?ギャーーーーー!!!
[hr]
というわけで予想点数は92点です。さあ、どうなるかな.....

ISLe
記事: 2650
登録日時: 15年前

Re: 情報オリンピック予選

投稿記事 by ISLe » 14年前

おっさんなので参加できませんが標準入出力使ったほうが時間短縮できる気がします。
例えば一問目は

CODE:

#include 
int main(void) {
	int sum = 0, s;
	while (scanf("%d", &s) == 1)
		sum += s;
	printf("%d\n%d\n", sum/60, sum%60);
	return 0;
}
実行は
q1.exe a1-1.txt
という感じで。