E. Exam Results
题目意思
给出n个人 每个人有两种成绩,小的ai,大的bi
定下每个人的成绩后 令这些成绩的最大值为max
记录成绩不小于max*p/100的数量
求这个数量的最大值
题目思路
将所有成绩按从小到大排序 可以看作全部放在数组上
先找到包含每个人至少一个成绩的最小位置
从这个位置开始记录满足条件的数量 维护最大值
记录方式可以用尺取法
ac代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 5e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353
int a[maxn],num[maxn];
map<int,int>mp;
struct node
{
ll a,id;
}e[maxn];
bool cmp(node a,node b)
{
return a.a<b.a;
}
int main()
{
int _,cas=0;
scanf("%d",&_);
while(_--)
{
int n,m;
scanf("%d%d",&n,&m);
int num=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&e[++num].a);
e[num].id=i;
scanf("%lld",&e[++num].a);
e[num].id=i;
}
printf("Case #%d: ",++cas);
sort(e+1,e+1+num,cmp);
int l=1,r=0;
int ans=1,res=0;
while(res!=n)
{
r++;
if(mp[e[r].id]==0)
{
res++;
}
mp[e[r].id]++;
}
if(mp[e[r].id]==1)
{
res--;
}
mp[e[r].id]--;
//printf("%d %d ",res,r);
while(r<=num)
{
if(mp[e[r].id]==0)
{
res++;
}
mp[e[r].id]++;
while(e[r].a*m>e[l].a*100)
{
mp[e[l].id]--;
if(mp[e[l].id]==0)res--;
l++;
}
ans=max(ans,res);
r++;
}
printf("%d\n",ans);
mp.clear();
}
}
J - Kingdom’s Power
这题补到想死 写了四五个小时还是没写出来 码力还是太差了
最后还是面向题解编程了 直接放大佬的博客吧
https://www.cnblogs.com/crazyfz/p/13838422.html