• 「USACO 做题笔记」USACO 2011 Dec Bronze


    做题时间:2022.8.10

    Hay Bales(haybales)

    题意

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

    思路

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

    代码

    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    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
    using namespace std;
    
    int n,a[25],b[25],ans;
    
    void dfs(int dep,int s)
    {
    	if(dep>n)
    	{
    		int p=0;
    		//cerr<
    		for(int i=1;i<s;i++)
    		{
    			//cerr<
    			int t=p,k=b[i];
    			p+=b[i];
    			while(t||k)
    			{
    				if(t%10+k%10>9) return;
    				t/=10;
    				k/=10;
    			}
    		}
    		//cerr<
    		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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    Optimization of DQN
    【Ingress】
    springboot13:数据库分析
    doc转html后添加style和导航
    git分支
    旅游景区度假村展示型网站如何建设渠道品牌
    API接口漏洞利用及防御
    基于php+mysql的菜品食谱美食网
    Android | 再探 RecyclerView 之名词解析
    NPDP如何续证?操作指南来了!
  • 原文地址:https://blog.csdn.net/Leo_Chenjy/article/details/126325382