种花

种花

题目描述

经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场——南山南中学。一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来。

他发现花的摆放竟有如此奥秘:圆形广场共有 个种花的位置,顺时针编号1到N。并且每个位置都有一个美观度ai,如果在这里种花就可以得到这ai的美观度。但由于地处南山土壤肥力欠佳,两株花不能种在相邻的位置(1号和N号也算相邻位置)。校方一共给了 株花,经过园丁的精妙摆放,才能如此吸引小D。所以现在小D也想知道应该如何摆这 株花。

输入

输入第一行包含两个整数N,M 

接下来一行包含N个正整数,依次描述美观度a1,a2,...,aN。

输出

输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。

样例输入

7 3
1 2 3 4 5 6 7

样例输出

15

提示

对于50%的数据满足N≤3000 。

对于100%的数据满足M≤N≤200000,-1000≤ai≤1000。

分析:由于相邻不能种花,所以贪心时要避免取出相邻的,否则就把之前的放回使得更优;

   优先队列维护;

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<ll,int>
#define Lson L, mid, ls[rt]
#define Rson mid+1, R, rs[rt]
const int maxn=2e5+10;
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
inline ll read()
{
    ll x=0;int f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,m,k,t,pre[maxn],nxt[maxn];
ll ans,a[maxn];
bool flag[maxn];
priority_queue<pii >p;
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    rep(i,1,n)
    {
        scanf("%lld",&a[i]);
        pre[i]=i==1?n:i-1;
        nxt[i]=i==n?1:i+1;
        p.push(mp(a[i],i));
    }
    if(m>n/2)puts("Error!");
    else
    {
        rep(i,1,m)
        {
            while(flag[p.top().se])p.pop();
            pii x=p.top();p.pop();
            ans+=x.fi;
            a[x.se]=a[pre[x.se]]+a[nxt[x.se]]-a[x.se];
            flag[pre[x.se]]=flag[nxt[x.se]]=true;
            nxt[x.se]=nxt[nxt[x.se]];
            pre[x.se]=pre[pre[x.se]];
            nxt[pre[x.se]]=x.se;
            pre[nxt[x.se]]=x.se;
            p.push(mp(a[x.se],x.se));
        }
        printf("%lld
",ans);
    }
    //system("Pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/5937648.html