zoukankan      html  css  js  c++  java
  • ZOJ 3715 Kindergarten Election

    题目大意

    意思就是这里有n个小朋友要选一个班长。

    每一个小朋友都有一票,小朋友因为害羞不会投自己,只会投给他们最好的同学。现在1号小朋友想要当班长,而且是当唯一的班长,这就意味着他的票数必须要大于其他人的所有票。他可以通过买糖果给其他小朋友让他们把票投给他自己。

    现在求1号当上班长需要花费的最小糖果数。

    这道题目的思路就是枚举他最小的票数s,然后每次贪心找到每种情况的最小花费。

    对于每种情况,都有:

    • 先枚举2-n同学中票数大于等于s的。假设对于同学i有s+6票,那么在这s+6票中,找出花费糖果最小的7票。然后花费这么多糖果来争取他们的票数。
    • 对于1号同学如果经历完第一步票数还不够s票。从剩下的票数中,每次找的最小花费的同学,依次花费糖果。 直到大于等于s票
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 107;
    bool visited[N];
    pair<int, int>par[N];
    vector<int> vec[N];
    int n;
    
    int cal(int k)
    {
    	memset(visited, false, sizeof(visited));
    
    	int ans = 0;
    	int s = vec[1].size();
    
    	for(int i=2; i<=n; ++ i)
    	{
    		if(vec[i].size() >= k)
    		{
    			for(int j=0; vec[i].size() - j >= k; ++ j)
    			{
    				int t = vec[i][j];
    				ans += par[t].first, visited[t] = true, ++ s;
    			}
    		}
    	}
    
    	if(s < k)
    	{
    		for(int i=0; i<n-1; ++ i)
    		{
    			if(visited[i] == false && par[i].second != 1)
    				ans += par[i].first, ++ s;
    
    			if(s >= k)
    				break;
    		}
    	}
    	return ans;
    }
    
    int solve()
    {
    	cin >> n;
    	for(int i=0; i<n-1; ++ i)
    		cin >> par[i].second;
    	for(int i=0; i<n-1; ++ i)
    		cin >> par[i].first;
    
    	sort(par, par+n-1);
    	for(int i=1; i<=n; ++ i)
    		vec[i].clear();
    	for(int i=0; i<n-1; ++ i)
    		vec[par[i].second].push_back(i);
    
    	int ans = INT_MAX;
    	for(int i = max((int)vec[1].size(), 1); i<=n-1; ++ i)
    	{
    		ans = min(ans, cal(i));
    		//cout << i << ":" << ans << endl;
    	}
    	return ans;
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	
    	//freopen("in.txt", "r", stdin);
    	//freopen("out.txt", "w", stdout);
    
    	int t;
    	cin >> t;
    	for(int i=1; i<=t; ++ i)
    		cout << solve() << endl;
    	return 0;
    }
    
  • 相关阅读:
    关于今后的进展
    很久没来了
    达到极限了
    寒假进度4Scala环境配置
    寒假进度3Jupyter运行PyTorch
    寒假进度2Pycharm运行PyTorch
    寒假进度7Python与Jupyter使用对比
    寒假进度6音频多人声分离赛题分析
    《Google的软件测试之道》(5)
    《Google的软件测试之道》(6)
  • 原文地址:https://www.cnblogs.com/aiterator/p/6786623.html
Copyright © 2011-2022 走看看