• P1792 [国家集训队]种树


    P1792 [国家集训队]种树

    题目描述
    A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。

    园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。

    最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。

    输入输出格式
    输入格式:
    输入的第一行包含两个正整数n、m。第二行n个整数Ai。

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

    Solution

    这题的环形板
    恰好用到了链表维护左右关系, 环形只需要把首尾处理一下即可
    记得判是否可行

    Code

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #include<climits>
    typedef long long LL;
    using namespace std;
    int RD(){
        int out = 0,flag = 1;char c = getchar();
        while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
        while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
        return flag * out;
        }
    const int maxn = 200019;
    int num, m;
    struct Node{
    	int val, p;
    	bool operator < (const Node &a)const{
    		return val < a.val;
    		}
    	};
    priority_queue<Node>Q;
    int l[maxn], r[maxn], a[maxn];
    bool used[maxn];
    int main(){
    	num = RD();m = RD();
    	if(m > num / 2){printf("Error!
    ");return 0;}
    	for(int i = 1;i <= num;i++){
    		a[i] = RD();l[i] = i - 1;r[i] = i + 1;
    		Q.push((Node){a[i], i});
    		}
    	l[1] = num;r[num] = 1;
    	int ans = 0;
    	while(m--){
    		while(used[Q.top().p])Q.pop();
    		ans += Q.top().val;
    		int p = Q.top().p;
    		Q.pop();
    		a[p] = a[l[p]] + a[r[p]] - a[p];
    		used[l[p]] = used[r[p]] = 1;
    		l[p] = l[l[p]];r[p] = r[r[p]];
    		r[l[p]] = p;
    		l[r[p]] = p;
    		Q.push((Node){a[p], p});
    		}
    	printf("%d
    ", ans);
    	return 0;
    	}
    
  • 相关阅读:
    寒武纪思元290芯片和MLU290-M5卡
    NUMA Domian和NUMA Distance
    Understanding Habana Labs's GPU
    AMD Instinct MI100-首个FP64性能超10TFLOPS的计算卡
    编程小记
    Redis二进制安全
    Redis布隆过滤器与布谷鸟过滤器
    缓存与缓存一致性协议
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9488922.html
Copyright © 2020-2023  润新知