种树3

codevs上的题目,自从wikioi改名后,就不怎么做题了。

这道题的话注释在代码中就可以了,还是求最长路,相较返回如果中间可以种多个的话,那就种越多越好,因为这样可以减少种的棵树,

所以这个i与i-1连一条负棵树的边,这样正的连0的边,以及范围的棵树边就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstring>
 7 using namespace std;
 8
 9 const int NN=500007,INF=1e9+7;
10
11 int n,m,a[NN],tot;
12 int cnt=0,head[NN],next[NN*4],rea[NN*4],val[NN*4];
13 int dis[NN];
14 bool flag[NN];
15 void add(int u,int v,int w)
16 {
17     cnt++;
18     next[cnt]=head[u];
19     head[u]=cnt;
20     rea[cnt]=v;
21     val[cnt]=w;
22 }
23 void spfa()
24 {
25     queue<int>q;
26     for(int i=1;i<=n;i++)
27         dis[i]=-INF;
28     dis[0]=0,flag[0]=1;
29     q.push(0);
30     while(!q.empty())
31     {
32         int u=q.front();
33         q.pop();
34         flag[u]=0;
35         for(int i=head[u];i!=-1;i=next[i])
36         {
37             int v=rea[i],fee=val[i];
38             if(dis[v]<dis[u]+fee)
39             {
40                 dis[v]=dis[u]+fee;
41                 if(!flag[v])
42                 {
43                     q.push(v);
44                     flag[v]=1;
45                 }
46             }
47         }
48     }
49 }
50 int main()
51 {
52     memset(head,-1,sizeof(head));
53     scanf("%d%d",&n,&m);
54     for(int i=1;i<=n;i++)
55         scanf("%d",&a[i]);
56     int x,y,z;
57     for(int i=1;i<=m;i++)
58     {
59         scanf("%d%d%d",&x,&y,&z);
60         add(x-1,y,z);
61     }
62     for(int i=1;i<=n;i++)
63     {
64         add(i-1,i,0);
65         add(i,i-1,-a[i]);
66     }
67     spfa();
68
69     printf("%d\n",dis[n]);
70 }
时间: 2024-08-27 20:42:49

种树3的相关文章

种树(贪心)

2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 714  Solved: 397[Submit][Status][Discuss] Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i

【BZOJ 2151】 2151: 种树 (贪心+堆)

2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置.值得注意的是1号和n号也算相邻位置!).最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大.如果无法将m棵树苗

雷军:做安卓平板生态 总要有人先种树

文/雷军 不少米粉一直都在呼吁我们做平板,在此之前市场上的Android平板也不少.但为什么小米创业四年后我们才开始做?因为平板是个非常难做的产品. 苹果CEO Tim Cook没少挖苦Android平板.去年他说, iPad占据了平板市场 81%的流量份额,众多Android平板加起来过 19%.前年他甚至还说过,所有的Android平板都在仓库里或者用户的抽屉里吃灰. 从硬件角度看,Android平板并不是很难做.市场上各类Android板满天飞,有的很贵要好几千元,也有很多性能很差的平板便

洛谷P1250种树(贪心)

题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T.这三个数表示该居民想在B和E之间最少种T棵树.当然,B≤E,居民必须记住在指定区不能种多于区域地块数的树,所以T≤E-B+l.居民们想种树的各自区域可以交叉.你的任务是求出能满足所有要求的最少的树的数量. 写一个程序完成以下工作: 输入输出格式 输入格式: 第一行包含数据N,区域的个数(0<N≤

1768 种树 3

1768 种树 3 2012年 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 为了绿化乡村,H村积极响应号召,开始种树了. H村里有n幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上1~n.树就种在房子前面的空地上. 同时,村民们向村长提出了m个意见,每个意见都是按如下格式:希望第li个房子到第ri个房子的房前至少有ci棵树. 因为每个房屋前的空地面积有限,所以每个房屋前

[swustoj 183] 种树

种树(0183) 问题描述 Aconly有一块矩形的地,因为这块地里有很多石头,耕作很不方便,所以他打算在这块地上种一些果树.这块地用一个只含‘#’和‘*’的N*M的矩阵来表示,‘#’表示泥土,‘*’表示石头.当然有石头的地方是不能种树的,而且任意两棵树之间不能离得太近,表现在矩阵中就是不能上.下.左.右.左上.右上.左下.右下八个方向相邻.你的任务就是帮助Aconly算出这块地最多可以种多少棵树. 输入 有多组测试数据.每组测试数据以两个整数N和M开头,随后有N行只含‘#’和‘*’的字符,每行

[Data Structure] 数据结构中各种树

数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构. 二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2i-1个结点:深度为k的二叉树至多有2k-1个结点:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=

BZOJ2151 种树

Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 565  Solved: 310[Submit][Status][Discuss] Description A 城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到 n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和 i+

1653 种树 2

1653 种树 2 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1…n.每个块的大小为一个单位尺寸并最多可种一裸树.每个居民想在门前种些树并指定了三个号码b,e,t.这三个数表示该居民想在b和e之间最少种t棵树.当然,b≤e,居民必须保证在指定地区不能种多于地区被分割成块数的树,即要求T≤ e-b+1.允许居民想种树的各自区

[COGS1862]种树 解题报告

[问题描述] A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置.值得注意的是1号和n号也算相邻位置!). 最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大.如果无法将m棵树苗全部种上,给出无解信息.