萌 新 求 助 ( 会 关 注 的 )
查看原帖
萌 新 求 助 ( 会 关 注 的 )
91956
Dreamweaver楼主2021/3/14 21:06
#include<map>
#include<list>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define il inline
#define ll long long
#define rl register ll
#define ri register int
#define rc register char
#define re register
#define mod 1000007
using namespace std;
int n,m;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
struct goods
{
	int num,v;
}a[1010],b[1010];
bool cmp(goods a,goods b)
{
	return a.v>b.v;
}
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
//	printf("%dM\n",(sizeof(dp) >> 20))
	cin>>n>>m;
	int o1=0,o2=0;
	int t1=0,t2=0;
	for(re int i=1;i<=n;i++)
	{
		int x,y;
		x=read(),y=read();
		if(y==1)
			a[++o1].v=x,a[o1].num=i,t1+=x;
		else
			b[++o2].v=x,b[o2].num=i,t2+=x;
	}
	//	cout<<n-m+o1-1<<' '<<endl;
	//	cout<<endl;
	if(o1<=m-1)
	{
		double ans=t1/2.0;
		ans+=t2;
		printf("%.1f\n",ans);
	//	cout<<o1<<' '<<o2<<endl;
	//	cout<<endl;
	//	for(re int i=1;i<=o2;i++)
	//		cout<<b[i].num<<' ';
	//	cout<<endl;
	//	cout<<endl;
		for(re int i=1;i<=o1;i++)
			cout<<1<<' '<<a[i].num<<'\n';
		for(re int i=1;i<m-o1;i++)
			cout<<1<<' '<<b[i].num<<'\n';
		cout<<n-m+o1<<' ';
		for(re int i=m-o1;i<=o2;i++)
			cout<<b[i].num<<' ';
	}
	else
	{
		int op=t1+t2,t3=0;
		sort(a+1,a+1+o1,cmp);
		for(re int i=1;i<m;i++)
			t3+=a[i].v;
		int u=99999999;
		for(re int i=m;i<=o1;i++)
			u=min(u,a[i].v);
		for(re int i=1;i<=o2;i++)
			u=min(u,b[i].v);
		double ans1=op-t3+t3/2.0;
		//cout<<u<<endl;
		//cout<<t1<<' '<<t2<<' '<<t3<<' '<<ans1-u/2.0;
		printf("%.1f\n",ans1-u/2.0);
		for(re int i=1;i<m;i++)
			cout<<1<<' '<<a[i].num<<'\n';
		cout<<n-m+1<<' ';
		for(re int i=m;i<=o1;i++)
			cout<<a[i].num<<' ';
		for(re int i=1;i<=o2;i++)   
			cout<<b[i].num<<' ';
	}
	return 0;
}

求调(码写的太丑了,见谅)

2021/3/14 21:06
加载中...