考試總結2019-10-06

T1
思路:這道題比較簡單,直接循環查找即可(點(a,b)至點(a1,b1)的距離爲(abs(a-a1)+abs(b-b1)),好多人直接dfs???)
代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=100+10,INF=2147483647;
int n,m,x,y,a[maxn][maxn],st,minx,miny,dis=INF;
int main(){
	freopen("friend.in","r",stdin);
	freopen("friend.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&x,&y);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(a[i][j]==a[x][y]){//判斷是否爲懶羊羊的好朋友
				if(i==x&&j==y)//如果就是懶羊羊,取消
					continue;
				if(x==i){//如果位於同一行,則距離爲縱座標之差的絕對值
					if(dis>abs(y-j)){//嘗試更新(小剪枝)
						dis=abs(y-j);
						minx=i;
						miny=j;
					}
				}
				else{
					if(dis>abs(x-i)+abs(y-j)){//否則,算出它們的距離,跟當前最小比較
						dis=abs(x-i)+abs(y-j);
						minx=i;
						miny=j;
					}
				}
			}
		}
	printf("%d %d",minx,miny);
	return 0;
}

T2

思路:先將0-7的階乘算出來,發現再向上的階乘就超過題目限定的1000000了,所以我們就可以運用貪心的思路
代碼:

#include <bits/stdc++.h>
using namespace std;
int num[10]={1,1,2,6,24,120,720,5040,40320,362880},n;
int main(){
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	while(1){
		scanf("%d",&n);
		if(n<0)
			return 0;
		if(n>409114||n==0){
			printf("NO\n");
			continue;
		}
		for(int i=9;i>=0;i--)//貪心
			if(num[i]<=n&&n>0)
				n-=num[i];
		if(n==0)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

T3
思路:這道題就是一個純模擬題,但是我卻卡了一個多小時。因爲我用的是scanf讀入,空格和回車都要用一個getchar,不過改成cin就沒問題了。

改進:以後經量用cin,少用scanf
代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=200+5,INF=2147483647;
int n,m;
struct hot{
	int id,a;
	string name;
	int people,number,value,allpeople;
	char side;
}hotel[maxn];
struct tel{
	char kind;
	int people,perseveryroom;
}vistor[maxn];
int main(){
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	int bed=-INF,pc=INF;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		hotel[i].id=i;
		cin>>hotel[i].a;
		int a=hotel[i].a;
		if(20<=a&&a<=35)
			hotel[i].side='A';
		if(36<=a&&a<=48)
			hotel[i].side='B';
		if(49<=a&&a<=62)
			hotel[i].side='C';
		cin>>hotel[i].people>>hotel[i].number>>hotel[i].value;
		cin>>hotel[i].name;
		//hotel[i].allpeople=hotel[i].people*hotel[i].number;
		getchar();
	}
	for(int i=1;i<=m;i++){
		int num;
		cin>>vistor[i].kind>>vistor[i].people>>vistor[i].perseveryroom;
		int minn=INF,pd=28;
		for(int j=1;j<=n;j++){
			//if(hotel[j].allpeople<vistor[i].people)
			//	continue;
			if(hotel[j].side!=vistor[i].kind)
				continue;
			int k,szsh;
			szsh=min(vistor[i].perseveryroom,hotel[j].people);
			if(szsh*hotel[j].number<vistor[i].people){
				continue;
			}
			if(vistor[i].people%szsh==0)
				k=vistor[i].people/szsh;
			else
				k=vistor[i].people/szsh+1;
			int money=k*hotel[j].value;
			if(money<minn){
				minn=money;
				pd=233;
				num=hotel[j].id;
				bed=hotel[j].a;
			}
			else if(money==minn){
				minn=money;
				pd=233;
				if(hotel[j].a>bed){
					num=hotel[j].id;
					bed=hotel[j].a;
				}
				else if(hotel[j].a==bed){
					if(num>hotel[j].id){
						num=hotel[j].id;
						bed=hotel[j].a;
					}
				}
			}
		}
		if(pd==28)
			cout<<"no-hotel"<<endl;
		else{
			cout<<minn<<" "<<hotel[num].name<<endl;
		}
		getchar();
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章