考试总结2019-10-06

23 篇文章 0 订阅
9 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值