种花
题目描述
经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场——南山南中学。一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来。
他发现花的摆放竟有如此奥秘:圆形广场共有 N 个种花的位置,顺时针编号1到N。并且每个位置都有一个美观度ai,如果在这里种花就可以得到这ai的美观度。但由于地处南山土壤肥力欠佳,两株花不能种在相邻的位置(1号和N号也算相邻位置)。校方一共给了 M 株花,经过园丁的精妙摆放,才能如此吸引小D。所以现在小D也想知道应该如何摆这 N 株花。
输入
输入第一行包含两个整数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; }