K - Kindergarten Election

5人阅读 评论(0) 收藏 举报
分类:
从max(1, num[1])开始枚举,一直到n-1,每一个枚举的数的意思是:这个票数可以让1号当选唯一的leader,所以在每此枚举时,要从2号到n号,遍历一遍,如果num[i] >= num[1]则就要在支持i号的人当中选出最小代价的num[i] - num[1] + 1位,用糖果收买他,并使nownum ++(每此枚举的初始值是num[1]),注意记录代价,一个遍历完以后,如果nownum==当前枚举的数时,就把这次枚举的总代价和Min相比,取较小的值,,如果nownum > num[1].那么这种情况是不合法的,不符合我们前面枚举的意图,如果nownum < num[1],那么就从剩下的没有被收买的人当中,在收买num[1] - nownum 个人,记录下代价和Min比较,取较小值,思路就是这样
#include <bits/stdc++.h>

using namespace std;

const int inf = 0X3f3f3f3f;
int vote[110],num[110];
int val[110];
bool vis[110];
bool tmp(int x, int y)
{
    return val[x] < val[y];
}
int main()
{
    int sum;
    scanf("%d", &sum);
    while(sum --){
       int n;
       memset(num, 0, sizeof(num));
       scanf("%d", &n);
       for(int i = 2; i <= n; i ++){
            scanf("%d", &vote[i]);
            num[vote[i]] ++;
       }
       for(int i = 2; i <= n; i ++){
            scanf("%d", &val[i]);
       }
       int Min = inf;
       int cost;
       int nownum;
       for(int i = max(1, num[1]); i < n; i ++){
            memset(vis, false, sizeof(vis));
            cost = 0;
            nownum = num[1];
            for(int j = 2; j <= n; j ++){
               if(num[j] >= i){
                    int shu[110];
                    int cnt = 0;
                    int len = num[j] - i + 1;
                    for(int z = 2; z <= n; z ++){
                        if(vote[z] == j){
                            shu[cnt ++] = z;
                        }
                    }
                    sort(shu, shu + cnt, tmp);
                    for(int z = 0; z < len; z ++){
                        //cout << shu[z] << endl;
                        cost += val[shu[z]];
                        vis[shu[z]] = true;
                        nownum ++;

                    }
               }
            }
            if(nownum > i) continue;
            int len = i - nownum;
            //cout << len << endl;
            int shu[110];
            int cnt = 0;
            for(int j = 2; j <= n; j ++){
                if(!vis[j] && vote[j] != 1){
                    shu[cnt ++] = j;
                }
            }
            sort(shu, shu + cnt, tmp);
            for(int j = 0; j < len; j ++){
                cost += val[shu[j]];
               // cout << shu[j] << endl;
            }
            Min = min(cost, Min);
       }
       cout << Min <<endl;
    }
    return 0;
}

查看评论

Kindergarten Election(枚举+贪心)

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=88#problem/F 题意: 在幼儿园里..每个小朋友投一票选举领导,得票最多...
  • u013081425
  • u013081425
  • 2014年03月07日 14:56
  • 1008

ZOJ-3715 Kindergarten Election(贪心+枚举)

Kindergarten Election Time Limit: 2 Seconds      Memory Limit: 65536 KB At the beginning ...
  • Aiwen1413
  • Aiwen1413
  • 2017年04月08日 14:08
  • 166

ZOJ 3715 Kindergarten Election 幼儿园的选举(枚举贪心)

点击打开链接
  • Dinivity123
  • Dinivity123
  • 2014年04月17日 11:20
  • 1415

ZOJ 3715 Kindergarten Election(枚举+贪心)

Kindergarten Election Time Limit: 2 Seconds      Memory Limit: 65536 KB At the beginning of the s...
  • u013268685
  • u013268685
  • 2014年12月19日 18:28
  • 1155

zoj 3715 Kindergarten Election

#include #include #include #include #define eps 1e-5 #define MM 0x3f3f3f3f using namespace std; int ...
  • dominating413421391
  • dominating413421391
  • 2015年02月01日 20:16
  • 576

ZOJ 3715 Kindergarten Election

题意: n个人投票  唯一一个票数最多的人当选  1想当选  他可以通过给别人糖让不选他的人选他  问  最少需要多少糖 思路: 由于n比较小  可以枚举1当选时得了多少票  这样就可以...
  • u013351160
  • u013351160
  • 2014年04月02日 20:08
  • 854

Kindergarten Election(ZOJ3715)

题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3715 题目大意:幼儿园里有好n个小朋友,然后需要从这些小朋友里边选出一个幼...
  • tinyguyyy
  • tinyguyyy
  • 2016年04月09日 17:45
  • 431

ZOJ3715 Kindergarten Election(贪心,模拟)

题目: Kindergarten Election Time Limit: 2 Seconds      Memory Limit: 65536 KB At the beginning...
  • riba2534
  • riba2534
  • 2017年04月10日 13:16
  • 199

ZOJ 3715 Kindergarten Election 解题报告

题目 题意: 一群人选班长(貌似),除1号外每个人投哪个都已知,1号想当班长,要求他是票最多的且不能有并列,他不能投给自己,但是可以收买别人投自己,每个人的收买花费都告诉你,求最小花费。 解法: 枚举...
  • u010638776
  • u010638776
  • 2013年05月30日 20:15
  • 1040

zoj3715 Kindergarten Election 【枚举+贪心】

不枚举要几票获胜根本想不同。 枚举获胜需要的票数(最少是2),然后自己这也票投给谁都没有影响。#include using namespace std; struct node { int ...
  • xinag578
  • xinag578
  • 2016年04月27日 18:08
  • 303
    个人资料
    持之以恒
    等级:
    访问量: 3187
    积分: 757
    排名: 6万+
    最新评论