【bzoj1334】[Baltic2008]Elect

来源:互联网 发布:java 设置时区 编辑:程序博客网 时间:2024/06/12 00:00

Description

N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的.
Input

第一行给出有多少个政党.其值小于等于300 下面给出每个政党的席位数.总席位数小于等于 100000
Output

你的组阁方案中最多能占多少个席位.
Sample Input

4
1 3 2 4
Sample Output

7
HINT

选择第二个政党和第四个

题解
从大到小排序,然后背包,因为这样满足了拿走当前的,可以保证剩下的一定不会超过总数的一半

代码

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#define mod 1000000007#define N 10005#define M 50005typedef long long ll;using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,sum,a[305],f[100005];int main(){    n=read();    for (int i=1;i<=n;i++)        a[i]=read(),sum+=a[i];    sum/=2;    sort(a+1,a+n+1,greater<int>());    f[0]=1;    for (int i=1;i<=n;i++)        for (int j=sum+a[i];j>=a[i];j--)            f[j]|=f[j-a[i]];    for (int i=sum+a[1];i>=0;i--) if (f[i]) return printf("%d",i),0; }
原创粉丝点击