K

阅读: 评论:0

K

K

K - Kindergarten Election

  ZOJ - 3715  从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;
}

本文发布于:2024-01-27 16:37:37,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063446561464.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23