您的位置:首页 > 其它

zoj 2343 Robbers (G)

2013-07-22 03:00 267 查看
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2343

题目分析:

1题目大意就是按照预先定好的标准分钱,一个很大的提示就是 y不整除m ,自然想到先用代余除法,把能按照这个方式分的钱分完再说,但是余下的钱仍然可能过比n大不好分

应该是先每个人得到 [ x[i]*k/m ] 这么多钱 ,由高斯函数的性质知余下的钱不会多于n, 最后挑出对整体的 "方案不均匀系数"(即最后要求最小的那个数)影响最小的left个人(还剩left 块钱)

2 注意要点 将每个人放在struct 中,包含id 信息,这样在排序之后还能和原来的序列对应起来

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

struct robber
{
int money;
int id;
double inf;
};

int cmp(robber x,robber y)
{
if(x.inf<y.inf)  return 1;
else return 0;
}
int main()
{
int size;
cin>>size;
for(int l=0;l<size;l++)
{

int n,m,y;
cin>>n>>m>>y;
int *p=new int
;
for(int i=0;i<n;i++)
cin>>p[i];

int q
;

for(int i=0;i<n;i++)
{
q[i]=m*p[i]/y;
}

int sum=0;
for(int i=0;i<n;i++)
sum+=q[i];
int left=m-sum;

//  存在结构体中去
robber * rr=new robber
;
for(int i=0;i<n;i++)
{
rr[i].id=i;
rr[i].money=q[i];
rr[i].inf=abs((q[i]+1.0)/m-(p[i]*1.0)/y)-abs((q[i]*1.0)/m-(p[i]*1.0)/y);
}

sort(rr,rr+n,cmp);

for(int i=0;i<left;i++)
{
q[rr[i].id]++;
}

for(int i=0;i<n-1;i++)
cout<<q[i]<<" ";
cout<<q[n-1]<<endl;

if(l<size-1)  cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: