※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「AOJ541~550」の編集履歴(バックアップ)一覧に戻る
AOJ541~550」を以下のとおり復元します。
----
*0543 Receipt
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0543
レシートのデータで一つだけ金額がかすれているので残りの金額からかすれた部分の値段を求める問題。


解法
中学生にでも出題しそうな簡単な問題なので計算するだけです。 

 #include<stdio.h>
 int main(){
	int sum,all,i,t;
	while(1){
		scanf("%d",&all);
		if(all==0) break;
		i=9,sum=0;
		while(i--){
			scanf("%d",&t);
			sum+=t;
		}
		printf("%d\n",all-sum);
	}
 }



----
*0544 Sugoroku
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0544
すごろくの升目データとさいころの情報が与えられるので何手目でゴールできるかを答える問題。

解法
サイを振った後、升目の進む戻るで
ゴールを超えた升目を参照しないように注意さえすれば簡単な問題です。
コードをきれいにまとめられませんでした。

 #include<stdio.h>
 void setData(int n,int m){
	int map[1002];
	for(int i=1;i<=n;i++){
		scanf("%d",&map[i]);
	}
	int xai,nowP=1,ans;
	bool goal=false;
	for(int i=1;i<=m;i++){
		scanf("%d",&xai);
		if(goal==true) continue;
		nowP+=xai;
		if(n<=nowP){
			ans=i;
			goal=true;
			continue;
		}
		nowP+=map[nowP];
		if(n<=nowP){
			ans=i;
			goal=true;
		}
	}
	printf("%d\n",ans);
	
 }
 int main(){
	int n,m;
	while(1){
		scanf("%d %d",&n,&m);
		if(n==0 && m==0) break;
		setData(n,m);
	}
 }




----
*0545 Party
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0545
誰と誰が友達かの情報から、友達の友達が何人いるか答える問題です。

解法
友達の友達が実は単なる友達で探索が続く場合にさえ注意すれば再起探索で間に合う問題です。
素直に再起で実装しました。



 #include<stdio.h>
 #include<string.h>
 //簡単な問題なのでグローバル変数で手抜き
 const int max=502;
 bool con[max][max],moveOKs[max];
 int ans,n,m;
 void search(int deep,int no){
	//友達の友達が実は友達だった場合探索が続くので注意
	for(int i=2;i<=n;i++){
		if(con[no][i]){
			if(moveOKs[i]==true)ans++;
			moveOKs[i]=false;
			if(deep==0)search(deep+1,i);
		}
	}
 }
 void setData(){
	memset(con,    false, sizeof(con));
	memset(moveOKs,true , sizeof(moveOKs));
	moveOKs[1]=false;
	ans=0;
	int a,b;
	for(int i=0;i<m;i++){
		scanf("%d %d",&a,&b);
		con[a][b]=con[b][a]=true;
	}	
	search(0,1);
	printf("%d\n",ans);
 }
 int main(){
	while(1){
		scanf("%d %d",&n,&m);
		if(n==0 && m==0) break;
		setData();
	}
 }

復元してよろしいですか?