《签到只会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