刚才ICPC的K题
  • 板块学术版
  • 楼主Ginger_he
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/12/7 21:10
  • 上次更新2023/10/27 00:10:49
查看原帖
刚才ICPC的K题
379058
Ginger_he楼主2022/12/7 21:10
#include<bits/stdc++.h>
using namespace std;
#define N 505
struct node
{
	int p,v;
	bool operator < (const node &x) const
	{
		return v>x.v;
	}
}a[N];
int n,m,k,cnt,x,y;
map<int,int> mp;
multiset<int> s; 
vector<int> g[N]; 
int main()
{
	scanf("%d%d",&n,&k);
	mp[n-1]=n;
	for(int i=1;i<=n;i++)
		s.insert(n-1);
	for(int i=n-k;i<n;i++)
	{
		if(mp[i])
			continue;
		while(s.size()>1&&*s.begin()>i)
		{
			auto it1=s.begin(),it2=s.end();
			x=*it1,y=*(--it2);
			s.erase(it2);
			if(mp[y]==1)
				continue;
			s.erase(it1);
			s.insert(x-1);
			s.insert(y-1);
			mp[x]--,mp[y]--;
			mp[x-1]++,mp[y-1]++;
		}
	}
	if(!mp[n-k])
	{
		printf("NO\n");
		return 0;
	}
	for(auto i:mp)
	{
		x=i.first,y=i.second;
		while(y--)
		{
			cnt++;
			a[cnt]=node{cnt,x};
		}
	}
	for(int i=1;i<=n;i++)
	{
		sort(a+1,a+n+1);
		for(int j=2;j<=a[1].v+1;j++)
		{
			g[a[1].p].push_back(a[j].p);
			m++,a[j].v--;
		}
		a[1].v=0;
	}
	printf("YES\n%d\n",m);
	for(int i=1;i<=n;i++)
	{
		for(auto j:g[i])
			printf("%d %d\n",i,j);
	}
	return 0;
}

大概就是每次选两个度数减 1,求 hack

2022/12/7 21:10
加载中...