您的位置:首页 > 其它

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest解题报告

2016-10-24 20:45 363 查看
a 题意:给n个数,每次可以选择2-5个数进行-1操作,当所有数都相等的时候停止,输出可能的最大值,并且输出任意一种方案,当x=0时进行操作,数不会再变小,并且操作次数不能超过10000

分析:最大为最小数,最小为0,n最大100,数最大100,和为1000,每次选择两个数进行操作,也最多5000次,所以只要贪心取最大值,然后再考虑方案

统计所有数的和假设答案的差,如果max*2<sum,那么必然可以找到一种操作方案,如果sum为奇数,就进行一次取三个最大的差,其余的取两个操作就行

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int a[maxn],b[maxn],c[maxn];
int n,sum,_min,cnt,k;
map<int,int> v[105];

int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i];
for(int i=1;i<=n;i++)cin>>b[i],c[i]=b[i];
sort(c+1,c+1+n);
for(k=n;cnt<sum;k--)cnt+=c[k];
cnt=n-k;
v[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=cnt-1;j>=0;j--){
for(auto & ttt:v[j]){
int t1=ttt.first+b[i],t2=ttt.second+a[i];
v[j+1][t1]=max(v[j+1][t1],t2);
}
}
int ans=0;
for(auto& tt:v[cnt]){
if(tt.first>=sum)
ans=max(ans,tt.second);
}
printf("%d %d\n",cnt,sum-ans);

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐