zoukankan      html  css  js  c++  java
  • 种花

    种花

    题目描述

    经过三十多个小时的长途跋涉,小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;
    }
  • 相关阅读:
    Ubuntu加上一个命令搜索路径/etc/ environment
    在Ubuntu中编译QT工程Tesful
    Java中的多线程
    [转载]iOS开发之手势识别
    OracleDBA之表管理
    JDBC与JAVA数据库编程
    Oracle之PL/SQL学习笔记
    在Objective-C中浅谈面向对象
    Web前端上万字的知识总结
    类比Spring框架来实现OC中的依赖注入
  • 原文地址:https://www.cnblogs.com/dyzll/p/5937648.html
Copyright © 2011-2022 走看看