WA on #3.
提示信息如下
Wrong Answer. wrong answer First number in output must be equal to the total cost of items. Found 1.0, Certificate Double Cost 1.
思路是尽量让现在最贵的凳子装在一个购物车,然后其他全部塞一辆车,如果装不满k-1个就让剩下的一个一个装车,最后还剩下的塞一辆车。
Code
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k,tot,cnt,p[1010][1010];
double ans;
struct node {int id; double v;} chair[1010],sold[1010];//tot:chair cnt:not chair
bool cmp(const node &a,const node &b) {return a.v < b.v;}
int main()
{
scanf("%d%d",&n,&k);
double c;
for(int i=1,t;i<=n;i++)
{
scanf("%lf%d",&c,&t);
if(t == 1) chair[++tot]=(node) {i,c};
else sold[++cnt]=(node) {i,c};
}
sort(chair+1,chair+1+tot,cmp);
sort(sold+1,sold+1+cnt,cmp);
int num=tot;
for(int i=1;i<k && i<=num;i++) {ans+=chair[tot].v*1.0/2.0; p[i][++p[i][0]]=chair[tot--].id;}
if(num >= k)
{
if(chair[1].v < sold[1].v) chair[1].v*=1.0/2.0;
else sold[1].v*=1.0/2.0;
for(int i=1;i<=tot;i++) {ans+=chair[i].v; p[k][++p[k][0]]=chair[i].id;}
for(int i=1;i<=cnt;i++) {ans+=sold[i].v; p[k][++p[k][0]]=sold[i].id;}
}
else
{
for(int i=num+1;i<k;i++) {ans+=sold[cnt].v; p[i][++p[i][0]]=sold[cnt--].id;}
for(int i=1;i<=cnt;i++) {ans+=sold[i].v; p[k][++p[k][0]]=sold[i].id;}
}
printf("%.1lf",ans);
for(int i=1;i<=k;i++)
{
printf("\n%d",p[i][0]);
for(int j=1;j<=p[i][0];j++) printf(" %d",p[i][j]);
}
return 0;
}
吐了。谢谢朋友们!