TMD
一题紫题两题黑题是吧
比赛时当然是毫无疑问地爆金币了
改题时也爆了
那么进入正题
这是提交记录
记录
比赛第一题,洛谷70分
所以我改了0.7题
这题貌似可以不用堆,而是直接用排序+二分来解决。
代码如下
#include
using namespace std;
int n,m,p,q,v[201000],ap[50005],bq[50005],l,r,mi,t,vq[200005];
struct tni
{
int a,b;
};
tni s[200015];
int cmp(tni aa,tni bb)
{
if(aa.a!=bb.a)
return aa.abb.b;
}
int main()
{
// freopen("taste.in","r",stdin);
// freopen("taste.out","w",stdout);
cin>>n>>m>>p>>q;
for(int i=1;i>s[i].a>>s[i].b;
}
sort(s+1,s+m+1,cmp);
for(int i=1;i>ap[i];
}
for(int j=1;j>bq[j];
}
sort(ap+1,ap+p+1);
sort(bq+1,bq+q+1);
if(n==q+p)
{
for(int i=1;i<=m;i++)
{
if(s[i].abq[q])
{
cout<<"-1"<l+1)
{
for(int i=0;i<=m;i++)
{
v[i]=0;
}
mi=(l+r)/2;
t=1;
while(s[t].am)
{
break;
}
t++;
}
for(int i=1;i<=p;i++)
{
for(int j=1;jm)
{
break;
}
v[t]=1;
t++;
}
}
t=1;
for(int i=1;ibq[q])
{
if(t0;i--)
{
for(int j=1;j<=mi;j++)
{
if(t<1)
{
break;
}
v[t]=1;
t--;
}
}
t=0;
for(int i=1;i(n-p-q)*mi)
{
l=mi;
}
else
r=mi;
}
cout<<r<<endl;
}
这题通过对美味度和价值两个变量进行有优先级(指先排美味度,若美味度相等再排价值)的排序来实现对每一道菜的分配,然后通过二分答案来找到一个最小值
本篇博客到此结束