CF798D 糖果(思维题)

mac2022-06-30  20

题目描述:

 

题解:

 

正确性证明:

首先因为每两个中b都取大的那个,所以b一定满足条件

我们着重讨论a:

举一个有五个数的例子,设排序后有这样一个数列

a+k4+k3+k2+k1,a+k3+k2+k1,a+k2+k1,a+k2,a (k4,k3,k2,k1均>=0)

极端情况下我们取

  a+k4+k3+k2+k1,a+k2+k1,a

剩下

  a+k3+k2+k1,a+k1

因为 a+k4+k3+k2+k1>k3+k1

所以 a+k4+k3+k2+k1>(a+k3+k2+k1)-(a+k2+k1)+(a+k1)-a

所以 (a+k4+k3+k2+k1)+(a+k2+k1)+a>(a+k3+k2+k1)+(a+k1)

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int n; struct data{ ll num;int id; }a[100005]; ll b[100005]; bool cmp(data x,data y){ return x.num>y.num; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i].num); a[i].id=i; } for(int i=1;i<=n;i++){ scanf("%lld",&b[i]); } sort(a+1,a+n+1,cmp); printf("%d\n",n/2+1); printf("%d ",a[1].id); for(int i=2;i<=n;i+=2){ if(b[a[i].id]<=b[a[i+1].id]) printf("%d ",a[i+1].id); else printf("%d ",a[i].id); } return 0; }

转载于:https://www.cnblogs.com/HarryPotter-fan/p/11378397.html

最新回复(0)