蒟蒻求调构造题
查看原帖
蒟蒻求调构造题
240191
MY(一名蒟蒻)楼主2021/2/5 11:46

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;
}

吐了。谢谢朋友们!

2021/2/5 11:46
加载中...