2014-2015 ACM-ICPC Northeastern European Regional Contest (NEERC 14)
题意理解
每种 Burrito有最大重量,每点一千克Albert会增加ai点开心,Barney会增加bi点不开心。
最终,Albert的开心值必须大于等于A,Batney的不开心值必须小于等于B。
如果有结果,就要输出最终的开心值和不开心值,以及每种 Burrito吃掉的重量
具体做法
结构体排序, Burrito的a/b越大越好。再贪心求解。
一定要输出n种 Burrito各自吃掉的重量。
错误原因
- 由于结构体排序, Burrito的顺序已经发生了变化,所以要在 Burrito原来的位置上记录结果,忽略了这一点,WA x 9。
- 一开始以为是这道题卡精度,一直“Wrong answer on test 3 ”,结果发现自己没读清楚题,而且忽略了按照原来顺序输出结果这个细节。
- 以后遇到高精度的题,还是要使用eps.
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 100005
double wei[maxn];
struct burrito
{
double weight;
double a,b;
int where;
}bu[maxn];
bool compare(const burrito &x,const burrito &y)
{
return (x.a*y.b)>(y.a*x.b);
}
int main()
{
freopen("burrito.in", "r", stdin);
freopen("burrito.out", "w", stdout);
int n;
double A,B;
scanf("%d%lf%lf",&n,&A,&B);
double happiness=0,unhappiness=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&bu[i].weight,&bu[i].a,&bu[i].b);
bu[i].where=i;
}
sort(bu,bu+n,compare);
for(int i=0;i<n;i++)
{
if(B-unhappiness>=bu[i].weight*bu[i].b)
{
unhappiness+=bu[i].weight*bu[i].b;
happiness+=bu[i].weight*bu[i].a;
wei[bu[i].where]=bu[i].weight;
}
else
{
happiness+=((B-unhappiness)*bu[i].a)/bu[i].b;
wei[bu[i].where]=(B-unhappiness)/bu[i].b;
unhappiness=B;
break;
}
}
if(happiness<A)
printf("-1 -1\n");
else
{
printf("%lf %lf\n",happiness,unhappiness);
for(int i=0;i<n;i++)
{
if(i==0)
printf("%lf",wei[i]);
else
printf(" %lf",wei[i]);
}
printf("\n");
}
fclose(stdin);
fclose(stdout);
return 0;
}
照着题解2014-2015 ACM-ICPC Northeastern European Regional Contest (NEERC 14)修改过的
带eps=0.000000001的一份代码
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 100005
const double eps=0.000000001;
double wei[maxn];
struct burrito
{
double weight;
double a,b;
int where;
}bu[maxn];
bool compare(const burrito &x,const burrito &y)
{
return (x.a*y.b)>(y.a*x.b);
}
int main()
{
freopen("burrito.in", "r", stdin);
freopen("burrito.out", "w", stdout);
int n;
double A,B;
scanf("%d%lf%lf",&n,&A,&B);
double happiness=0,unhappiness=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&bu[i].weight,&bu[i].a,&bu[i].b);
bu[i].where=i;
}
sort(bu,bu+n,compare);
/*for(int i=0;i<n;i++)
{
printf("##%d %d %d\n",bu[i].weight,bu[i].a,bu[i].b);
}*/
for(int i=0;i<n;i++)
{
if(B-unhappiness>=(bu[i].weight*bu[i].b)-eps)
{
unhappiness+=bu[i].weight*bu[i].b;
happiness+=bu[i].weight*bu[i].a;
wei[bu[i].where]=bu[i].weight;
//printf("unhappiness=%lf happiness=%lf\n",unhappiness,happiness);
}
else
{
if(unhappiness+eps<B)
{
happiness+=((B-unhappiness)*bu[i].a)/bu[i].b;
wei[bu[i].where]=(B-unhappiness)/bu[i].b;
unhappiness=B;
}
//printf("unhappiness=%lf happiness=%lf\n",unhappiness,happiness);
break;
}
}
if(happiness+eps<A)
printf("-1 -1\n");
else
{
printf("%.8lf %.8lf\n",happiness,unhappiness);
for(int i=0;i<n;i++)
{
if(i==0)
printf("%.8lf",wei[i]);
else
printf(" %.8lf",wei[i]);
}
printf("\n");
}
fclose(stdin);
fclose(stdout);
return 0;
}