【每日一题】Codeforces Round #744 (Div. 3) D Productive Meeting

本文介绍了一种使用C++ STL(标准模板库)解决会议中人员最优交谈策略的问题。通过优先队列和结构体设计,博主展示了如何在限制每个人社交能力的情况下,最大化会议中的有效对话次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《签到只会stl》(笑了)

 指到的人去刷到dp 。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚

题目:

        一个重要的会议要召开,正好邀请了n个人。 任何时候,任何两个人都可以退后一步,私下交谈。 同样的两个人可以在每次会议上多次(按他们想要的次数)交谈。 每个人的社交能力都是有限的。 第i个人的社交能力是一个非负整数ai。 这意味着在完全 ai 谈话之后,此人离开会议(并且不再与其他任何人谈话)。 如果ai=0,第i个人在会议开始后立即离开。 如果在会议期间进行了尽可能多的会谈,则会议被认为是最有成效的。 给你一组社交性 a,确定哪些人应该互相交谈,使谈话的总数尽可能多。

        这题就考stl,用map存离散的数据,用优先队列操作。

用struct存priority_queue

struct node{
	int num;
	int ss;
	bool operator < (const node &a)const
    {
        if(a.ss!=ss)
            return a.ss>ss;
    }
};
node per;
priority_queue<node>p;

主要操作简单易懂

    while(p.size()>=2){
			ans++;
			int x1=p.top().num;
			int x2=p.top().ss;
			p.pop();
			int y1=p.top().num;
			int y2=p.top().ss;
			p.pop();
			x2--;
			l1.push(x1);
			l2.push(y1);
			//cout<<x1<<" "<<y1<<endl;
			y2--;
			if(x2){
				per.num =x1;
				per.ss =x2;
				p.push(per);
			}
			if(y2){
				per.num=y1;
				per.ss =y2;
				p.push(per);
			}
		}

 ac代码

#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
struct node{
	int num;
	int ss;
	bool operator < (const node &a)const
    {
        if(a.ss!=ss)
            return a.ss>ss;
    }
};
node per;
priority_queue<node>p;
int main(){
	queue <int>l1;
	queue <int>l2;
	int t;
	cin>>t;
	while(t--){
		int num;
		int n;
		mp.clear();
		while(p.size()){
			p.pop();
		}
		cin>>n;
		int vis=0;
		for(int i=1;i<=n;i++){
			cin>>num;
			vis++;
			if(num==0)continue;
			//cout<<"vis "<<vis<<endl;
			mp[vis]=num;
		}
		
		for(auto i:mp){
			per.num =i.first;//cout<<"per.num " <<per.num<<endl;
			per.ss =i.second;//cout<<"per.ss "<<per.ss<<endl;
			if(per.ss==0)continue;
			p.push(per);
		}
		int ans=0;
		//cout<<"size "<<p.size()<<endl;
		while(p.size()>=2){
			ans++;
			int x1=p.top().num;
			int x2=p.top().ss;
			p.pop();
			int y1=p.top().num;
			int y2=p.top().ss;
			p.pop();
			x2--;
			l1.push(x1);
			l2.push(y1);
			//cout<<x1<<" "<<y1<<endl;
			y2--;
			if(x2){
				per.num =x1;
				per.ss =x2;
				p.push(per);
			}
			if(y2){
				per.num=y1;
				per.ss =y2;
				p.push(per);
			}
		}
		cout<<ans<<endl;
		while(l1.size()){
			
			cout<<l1.front()<<" "<<l2.front()<<endl;
			l1.pop();
			l2.pop();
		}
	}
}

学点stl就是能为所欲为

诶,我就等到考完了再发qwq

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值