P9421 [蓝桥杯 2023 国 B] 班级活动
思路:题目相当于就是叫我们给数据配对,所以给我们的n一定是一个偶数,其次把id若是相同而且超出2的部分记录下来,然后就开始给此id只有一个人的配对,等把超出2那一部分人用完以后,再把将剩下的人数记录下来两两配对
#include <iostream>
using namespace std;
int n,a,res,ans;
int q[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;q[a]++;
if(q[a]>2) res++;
}
int m=res;
for(int i=1;i<=n;i++)
{
if(m>0&&q[i]==1) m--;
else if(m==0&&q[i]==1) ans++;
}
if(res>0) cout<<res+ans/2;
else cout<<ans;
return 0;
}
P8685 [蓝桥杯 2019 省 A] 外卖店优先级
思路:考查优先队列,用优先队列记录一家外卖店订单的先后顺序,然后遍历记录在推荐序列的时刻,最后在和题目给的时刻比较
#include <queue>
#include <vector>
priority_queue<int,vector<int>,greater<int>> h[100010];升序
priority_queue<int,vector<int>,less<int>> h[100010];降序
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int,vector<int>,greater<int>> h[100010];
int n,m,t;
int ts,id;
int lastget;//上一次拿到外卖的时间
int x;//这一次拿到外卖的时间
int prilevel;//优先级
bool in;//是否在推荐队列里
int res;//记录指定时刻推荐队列的数量
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>t;
for(int i=0;i<m;i++)
{
cin>>ts>>id;
h[id].push(ts);
}
for(int j=1;j<=n;j++)
{
lastget=0;
prilevel=0;
in=false;
while(h[j].size())
{
x=h[j].top();
h[j].pop();出队
if(lastget!=x) prilevel-=(x-lastget-1);
prilevel=(prilevel<0?0:prilevel);
if(in&&prilevel<=3) in=false;
prilevel+=2;
if(prilevel>5) in=true;
lastget=x;
}
if(lastget!=t) prilevel-=(t-lastget);
if(prilevel<=3&&in) in=false;
if(in) res++;
}
cout<<res;
return 0;
}