题目大意:

n 个人 在选取班长 1号十分想当班长,他已经知道其他人选择了谁,但他可以贿赂其他人改选他,问贿赂的最小值

ps.他自己也要投一个人

要处理一个问题是,他自己投谁

其实这个问题在这种局面下在不同算法有不同处理方法,先不要考虑

一开始我想的是纯贪心:

选2个最小的比较票数最多中最小的  谁小选哪个

直到1号票数最多(但不是唯一)

这个时候再考虑 他投给谁

1.如果有一个人票数跟他一样多x ,这个时候1号还要拿一票,谁给他一票他就投给谁,不影响结果(给他同样票数的人,那个人票数不变,1号多了1票,所以也不变)

2.如果其他人票数都只比他少1  ,这个时候1号不需要拿票了,但他也必须投给一个人,会使得有人跟他一样,所以又要去拿一张最小的

3.其他情况投给票数比他少2的即可

但这样有反例

1

10

9  4 8 9  8 1 4  9  2

14 4 7 16 9 3 19 17 16

正解是 14+4;

而我的算法 先选了4+7,最后选了9 答案是20;

正确解法,枚举加贪心:

既然n<100 我应该就需要考虑到枚举or搜索的可能性,教训要牢记

枚举1获胜所得的票数p,在循环找所有大票大于p-1的人,从小到大给1,结束后超过p 表示不行

否则:在从小到大找几个填到p 更新ANS

对于1投给谁 ,只有这种情况有意义 1有p票 其他人p-1票

总票数 n*p-n+1+1(1的一票);

如果 p=1; 总票数 2 代表只有2个人 但是n>=3

如果 p=2; 总票数为n+2,超过了应该的总票数n

如果 p>2  于p=2同理 所以不需要考虑

代码如下:

//已知算法下
/*
1WA 原因 算法实现设计错误,最后一部,取k个最小的东西,可是因为按照优先序号排序的,所以算法与设计冲突 差错数据
6
1 2 2 3 3
7 8 9 1 1
正确: 2
错误 17
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
const int maxn=100+5;
struct node
{
int p,w;
int ok;
};
node A[maxn];
int piao[maxn];
int P[maxn];
void copy()
{
for(int i=0;i<maxn;i++)
A[i].ok=1;
for(int i=0;i<maxn;i++)
P[i]=piao[i];
}
int n;
void input()
{
cin>>n;
memset(piao,0,sizeof(piao));
for(int i = 1; i <= n - 1; i++)
{
scanf("%d",&A[i].p);
piao[A[i].p]++;
}
for(int i = 1;i <= n - 1; i++)
scanf("%d",&A[i].w);
}
bool cmp(node a,node b)
{
if(a.p==b.p) return a.w<b.w;
else return a.p<b.p;
}
bool cmp2(node a,node b)
{
return a.w<b.w;
}
void solve()
{
int ans=100000000,tans=0; for(int i=piao[1];i<=n-1;i++)
{
sort(A+1,A+n,cmp);
copy();tans=0;
for(int j=1;j<=n-1;j++)
{
if(A[j].p!=1)
{
if(P[A[j].p]>i-1)
{
A[j].ok=0;
tans+=A[j].w;
P[A[j].p]--;
P[1]++;
}
}
}
if(P[1]>i) continue;
else
{
sort(A+1,A+n,cmp2);
int tot=0;
for(int j=1;j<=n-1;j++)
if(tot<i-P[1])
if(A[j].p!=1)
{
if(A[j].ok==1)
{
tans+=A[j].w;
tot++;
}
}
}
if(tans<ans) ans=tans;
}
printf("%d\n",ans);
}
int main()
{
// init();
int T;
cin>>T;
while(T--)
{
input();
solve();
}
}

【枚举+贪心】【ZOJ3715】【Kindergarten Electiond】的更多相关文章

  1. D. Diverse Garland Codeforces Round #535 (Div. 3) 暴力枚举+贪心

    D. Diverse Garland time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. 51nod1625(枚举&贪心)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 题意:中文题诶- 思路:枚举+贪心 一开始写的行和列同时 ...

  3. 枚举+贪心 HDOJ 4932 Miaomiao's Geometry

    题目传送门 /* 题意:有n个点,用相同的线段去覆盖,当点在线段的端点才行,还有线段之间不相交 枚举+贪心:有坑点是两个点在同时一条线段的两个端点上,枚举两点之间的距离或者距离一半,尽量往左边放,否则 ...

  4. [BZOJ 1028] [JSOI2007] 麻将 【枚举+贪心判断】

    题目链接:BZOJ - 1028 题目分析 枚举听的是哪种牌,再枚举成对的是哪种牌,再贪心判断: 从1到n枚举每一种牌,如果这种牌的个数小于0,就返回不合法. 将这种牌的张数 % 3, 剩下的只能和 ...

  5. 【枚举+贪心】【TOJ3981】【ICPC Balloons】

    给你N种不同颜色气球,每种气球有个数目 count[i],给的同种颜色气球可能是L尺寸,或M尺寸. M个问题,每个问题有个解决人数ac[i]. 每个问题 要分配一种颜色的气球,尺寸要一样 现在 这些气 ...

  6. FZU 2252 Yu-Gi-Oh!(枚举+贪心)

    Problem 2252 Yu-Gi-Oh! Accept: 105    Submit: 628 Time Limit: 1000 mSec    Memory Limit : 32768 KB   ...

  7. UVALive 6912 Prime Switch 暴力枚举+贪心

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  8. bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  9. AtCoder - 2565 枚举+贪心

    There is a bar of chocolate with a height of H blocks and a width of W blocks. Snuke is dividing thi ...

随机推荐

  1. Python中的深浅拷贝,赋值及引用

    简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷 ...

  2. android-读取Assets图片资源保存到SD - 随心

    public class ReadBitmap { public void readByte(Context c, String name, int indexInt) { byte[] b = nu ...

  3. 谱聚类--SpectralClustering

    谱聚类通常会先对两两样本间求相似度. 然后依据相似度矩阵求出拉普拉斯矩阵,然后将每一个样本映射到拉普拉斯矩阵特诊向量中,最后使用k-means聚类. scikit-learn开源包中已经有现成的接口能 ...

  4. RMAN数据库恢复之控制文件和参数文件恢复

    一.控制文件的恢复1.查询控制文件的路径 SQL> SELECT * FROM V$CONTROLFILE; STATUS NAME IS_RECOVERY_DEST_FILE BLOCK_SI ...

  5. 【高精度递推】【HDU1297】Children’s Queue

    Children's Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. android——背景颜色渐变(梯度变化)

    首先在drawable文件夹下面新建一个xml文件,起名为bgcolor.xml. 代码如下: <?xml version="1.0" encoding="utf- ...

  7. Apache的httpd命令详解

    Apache的httpd命令详解 来源:全栈开发者 发布时间:2012-01-03 阅读次数:10965 4   httpd.exe为Apache HTTP服务器程序.直接执行程序可启动服务器的服务. ...

  8. android.view.InflateException: Binary XML file line #7: Error inflating class(OOM)

    由于页面含有ImageView引起的内存溢出. 作如下处理:在OnDestroy中 Drawable d = imageView.getDrawable(); if (d != null) d.set ...

  9. windows 数据类型转换为 dotnet 数据类型

    Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUB ...

  10. git基础命令

     git pull 更新git status 查看文件状态git add .添加所有git commit -a -m "xxxx" 提交git push 推送至服务器git dif ...