USACO铜组测试1

USACO铜组测试1

1.ABC问题

在这里插入图片描述
在这里插入图片描述
因为(A <= B <= C 且为正整数),所以数组中最小的一定是A,第二小的一定是B,最大的一定是A+B+C。

#include <bits/stdc++.h>
using namespace std;

int a[15];

int main(){
	freopen("abc.in","r",stdin);
	freopen("abc.out","w",stdout);
	for(int i=1;i<=7;++i)
	   cin >> a[i];
	sort(a+1,a+7+1);
	cout << a[1] << " ";
    cout << a[2] << " ";
    cout << a[7]-a[1]-a[2] << endl;
	fclose(stdin);
	fclose(stdout); 
	return 0;
}

2.雏菊花环

在这里插入图片描述
在这里插入图片描述

枚举

枚举每一个区间的第一位和最后一位,循环时就打一个map标记哪些花是有的,总和也随之累加,每次计算一下平均数就行了。

#include <bits/stdc++.h>
using namespace std;

int n,a[110],ans=0;
map<int,bool> mymap;

int main(){
	freopen("daisy.in","r",stdin);
	freopen("daisy.out","w",stdout);
	cin >> n;
	ans=n;
	for(int i=1;i<=n;++i)
	   cin >> a[i];
	int k=0;
	for(int i=1;i<=n;++i){
		mymap[a[i]]=1;
		k=a[i];
		for(int j=i+1;j<=n;++j){
			mymap[a[j]]=1;
			k+=a[j];
			if(k%(j-i+1)!=0)
			  continue;
			if(mymap[k/(j-i+1)]==1)
			  ans++;
	    }
	    mymap.clear();
	}
	cout << ans << endl;
	fclose(stdin);
	fclose(stdout); 
	return 0;
}

3.一成不变

在这里插入图片描述
在这里插入图片描述

枚举

首先将所有朝向N和朝向E的奶牛分开来讨论(pathu是朝北的奶牛,pathr是朝东的奶牛),再按坐标排个序,对于每一只向东走的奶牛,枚举所有向北走的奶牛,如果不可能阻隔,直接continue,否则判断是哪一只奶牛被阻隔了,这只奶牛有没有被其他的奶牛阻隔,如果没有,就可以得出ans,用vh标记一下奶牛被阻隔了即可。

#include <bits/stdc++.h>
using namespace std;

struct nod{
	int x;
	int y;
	int id;
	nod(int _x=0,int _y=0,int _id=0):x(_x),y(_y),id(_id){}
};
int n,a,b,ans[60];
bool vh[60];
vector<nod> pathr;
vector<nod> pathu;
char c;
vector<nod> g[60];
bool cmp1(nod p,nod q){
	return p.x<q.x;
}

bool cmp2(nod p,nod q){
	return p.y<q.y;
}
int main(){
	freopen("stuct.in","r",stdin);
	freopen("stuct.out","w",stdout);
	cin >> n;
	for(int i=1;i<=n;++i)
	   ans[i]=INT_MAX;
	for(int i=1;i<=n;++i){
		cin >> c >> a >> b;
		if(c=='N')
			pathu.push_back(nod(a,b,i));
		else
		    pathr.push_back(nod(a,b,i));
	}
	sort(pathu.begin(),pathu.end(),cmp1);
	sort(pathr.begin(),pathr.end(),cmp2);
	for(int i=0;i<pathr.size();++i){
		for(int j=0;j<pathu.size();++j){
			if(pathu[j].x<pathr[i].x || pathu[j].y>pathr[i].y)
			  continue;
			if(pathu[j].x-pathr[i].x==pathr[i].y-pathu[j].y)
			  continue;
			if(pathu[j].x-pathr[i].x>pathr[i].y-pathu[j].y){
				if(vh[pathu[j].id]==1)
			       continue;
				ans[pathr[i].id]=min(ans[pathr[i].id],pathu[j].x-pathr[i].x);
				vh[pathr[i].id]=1;
			}
			else{
				if(vh[pathr[i].id]==1)
				   continue;
				ans[pathu[j].id]=min(ans[pathu[j].id],pathr[i].y-pathu[j].y);
				vh[pathu[j].id]=1;
			}		
		}
	}
	for(int i=1;i<=n;++i){
		if(ans[i]!=INT_MAX)
		  cout << ans[i] << endl;
		else
		  cout << "Infinity" << endl;
	}
	fclose(stdin);
	fclose(stdout); 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值