「USACO 做题笔记」USACO 2011 Dec Bronze

做题时间:2022.8.10

Hay Bales(haybales)

题意

n n n 堆数量不相同的干草,现在可以移动任意干草堆的任意堆干草到任意干草堆,问最少移动多少堆干草使得每个干草堆数量相同。

思路

先求出每个干草堆应当的数量,然后看当前数量与其的差,得到的答案再除以二即可(因为一个干草堆少了意味着另一个干草堆多了)。
复杂度 O ( n ) O(n) O(n)

代码

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

int n,a[10005],sum,ans;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	sum/=n;
	for(int i=1;i<=n;i++)
	{
		ans+=abs(sum-a[i]);
	}
	cout<<ans/2;
 	return 0;
}

Cow Photography(photo)

题意

给定五个序列,每个序列都至多有一个数字放到最前面,求原序列。

思路

b i , j b_{i,j} bi,j 为第 i i i 个序列下 j j j 所处的位置。在排列时一个数至少会有三次处于正确的相对位置,故以此作为排序依据
复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

代码

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

int n,a[20005],b[15][20005];

bool cmp(int x,int y)
{
	int s=0;
	for(int i=1;i<=5;i++)
	{
		if(b[i][x]<b[i][y]) s++;
	}
	return s>2;
}

int main()
{
	cin>>n;
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[j];
			b[i][a[j]]=j;
		}
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<endl;
	}
 	return 0;
}

Escaping the Farm(escape)

题意

给定 n n n 个数 w i w_i wi,问最多可以选多少个数,使得其进行竖式计算时不会出现进位。

思路

dfs 爆搜一遍每种情况,然后模拟高精度一般去判断进位情况即可。
复杂度 O ( 2 n log ⁡ 10 w i ) O(2^n\log_{10}w_i) O(2nlog10wi)

代码

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

int n,a[25],b[25],ans;

void dfs(int dep,int s)
{
	if(dep>n)
	{
		int p=0;
		//cerr<<s-1<<':';
		for(int i=1;i<s;i++)
		{
			//cerr<<b[i]<<' ';
			int t=p,k=b[i];
			p+=b[i];
			while(t||k)
			{
				if(t%10+k%10>9) return;
				t/=10;
				k/=10;
			}
		}
		//cerr<<endl;
		ans=max(ans,s-1);
		return;
	}
	dfs(dep+1,s);
	b[s]=a[dep];
	dfs(dep+1,s+1);
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	dfs(1,1);
	cout<<ans;
 	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值