博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1986 元旦晚会
阅读量:6617 次
发布时间:2019-06-25

本文共 2416 字,大约阅读时间需要 8 分钟。

一道可以用各种各样的办法做的
(水)

在这里就介绍两种做法

题意:

自己看看吧,很明显的意思,就是求前i个人最少有多少个话筒。

解法1:差分约束

\(dis[i]\)表示前\(i\)个人最少有多少个话筒

根据题目意思每个人都只能有一个话筒 所以 \(dis[i[+1>=dis[i+1] dis[i+1]>=dis[i]\)

\(a_i\)\(b_i\)至少有\(c_i\)个 所以 \(dis[a_i-1]+c_i>=dis[b_i]\)

转换一下跑一遍最长路即可。

CODE:

#include
#include
#include
#include
#include
#include
#define N 30010#define M 5050#define INF 214748364using namespace std;struct edge { int to; int from; int data;}e[N * 2 + 1];int head[N],cnt;int dis[N],m,n;bool vis[N];queue
q;inline void add_edge(int x,int y,int z) { e[++cnt].from = y; e[cnt].data = z; e[cnt].to = head[x]; head[x] = cnt;}void spfa() { for(int i = 1 ; i <= n ; i++) dis[i] = -19260817; dis[1] = 0; q.push(1); vis[1] = true; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u] ; i ; i = e[i].to) { int v = e[i].from; if(dis[u] + e[i].data > dis[v]) { dis[v] = dis[u] + e[i].data; if(!vis[v]) { q.push(v); vis[v] = true; } } } }}int main() { //n = read(), m = read(); scanf("%d%d",&n,&m); while(m--) { //int l = read(), r = read(), k = read(); int u , v , w; scanf("%d%d%d",&u,&v,&w); add_edge(u - 1 , v , w); } for(int i = 1 ; i <= n ; i++) { add_edge(i - 1 , i , 0); add_edge(i , i - 1 , -1); } spfa(); printf("%d\n", dis[n]); return 0;}

啥,你不想写SPFA。不过没关系,我们还有另一种做法。

解法2:贪心

我们可以先按所有声部的右端点排序,再进行从后到前的顺序选取拿话筒的人。很显然,如果我们从后往前选取,就会尽量满足后面人的需求,这样就能达到最小值。

CODE:

#include
#include
#include
#include
using namespace std;const int N = 31000;struct node { int a; int b; int c;}e[N];int m,n,ans;int vis[N];inline bool cmp(node x,node y) { if(x.b != y.b) return x.b < y.b; return x.a < y.a;}void init() { scanf("%d%d",&n,&m); for(int i = 1 ; i <= m ; i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);}void work() { sort(e+1 , e + m + 1 , cmp); for(int i = 1 ; i <= m ; i++) { int cnt = 0; for(int j = e[i].b ; j >= e[i].a ; j--) { if(vis[j]) cnt++; } if(cnt > e[i].c) continue; else { for(int j = e[i].b ; (j >= e[i].b - e[i].c + 1 && cnt < e[i].c) ; j--) { if(!vis[j]) vis[j] = 1 , cnt++ , ans++; } } } printf("%d\n",ans);}int main() { init(); work(); return 0;}

转载于:https://www.cnblogs.com/Repulser/p/9662853.html

你可能感兴趣的文章
php 刷新不变倒计时,JS实现无刷新倒计时
查看>>
bat 起动nginx php,Linux_批处理代码搞定Windows下Nginx+PHP(FastCGI)管理,注意修改下开始头部的几个变 - phpStudy...
查看>>
php中json对象转字符串,JSON对象转字符串的一些方法
查看>>
Java判断gps点是否在中国,如何判断一个指定的位置点坐标(GPS上的经纬度)是否落在一个多边形区域内?...
查看>>
java如何提取dao层,[Java教程]java中entity和dao层生成之逆向工具
查看>>
java正则任意字符,Java正则表达式常用字符
查看>>
php取mysql数据库内存,PHP查询MySQL大量数据的内存占用分析
查看>>
mysql分页rownumber,解析数据库分页的两种方法对比(row_number()over()和top的对比)
查看>>
python return break 区别,python 不用break改用return
查看>>
php静态变量的含义,关于PHP静态变量
查看>>
qss 更改图标,更改颜色PNG图像QPushbutton
查看>>
微信 菜单栏 php,微信小程序实现导航栏选项卡的效果
查看>>
oracle 11 grid 安装,Oracle 11gR2 Grid Infrastructure 安装配置系列
查看>>
oracle11g查找正在运行的job,oracle如何查询和停止正在运行的job
查看>>
php打印自定义页眉页脚,例003:自定义页眉和页脚
查看>>
oracle包里代码部分,oracle 获取某个包 依赖的所有对象包括其子对象
查看>>
oracle 自增时输入绑定,oracle性能提高 批量绑定
查看>>
oracle配置linux系统,oraclelinux系统udev配置
查看>>
php修改模块布局,yii 修改模块使用的布局文件
查看>>
oracle使用dba用户导出数据,Oracle创造dba用户+导入导出数据库表
查看>>