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

在这里就介绍两种做法

题意:

自己看看吧,很明显的意思,就是求前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:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. #include<cmath>
  7. #define N 30010
  8. #define M 5050
  9. #define INF 214748364
  10. using namespace std;
  11. struct edge {
  12. int to;
  13. int from;
  14. int data;
  15. }e[N * 2 + 1];
  16. int head[N],cnt;
  17. int dis[N],m,n;
  18. bool vis[N];
  19. queue<int > q;
  20. inline void add_edge(int x,int y,int z) {
  21. e[++cnt].from = y;
  22. e[cnt].data = z;
  23. e[cnt].to = head[x];
  24. head[x] = cnt;
  25. }
  26. void spfa() {
  27. for(int i = 1 ; i <= n ; i++)
  28. dis[i] = -19260817;
  29. dis[1] = 0;
  30. q.push(1);
  31. vis[1] = true;
  32. while(!q.empty()) {
  33. int u = q.front();
  34. q.pop();
  35. vis[u] = false;
  36. for(int i = head[u] ; i ; i = e[i].to) {
  37. int v = e[i].from;
  38. if(dis[u] + e[i].data > dis[v]) {
  39. dis[v] = dis[u] + e[i].data;
  40. if(!vis[v]) {
  41. q.push(v);
  42. vis[v] = true;
  43. }
  44. }
  45. }
  46. }
  47. }
  48. int main() {
  49. //n = read(), m = read();
  50. scanf("%d%d",&n,&m);
  51. while(m--) {
  52. //int l = read(), r = read(), k = read();
  53. int u , v , w;
  54. scanf("%d%d%d",&u,&v,&w);
  55. add_edge(u - 1 , v , w);
  56. }
  57. for(int i = 1 ; i <= n ; i++) {
  58. add_edge(i - 1 , i , 0);
  59. add_edge(i , i - 1 , -1);
  60. }
  61. spfa();
  62. printf("%d\n", dis[n]);
  63. return 0;
  64. }

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

解法2:贪心

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

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = 31000;
  7. struct node {
  8. int a;
  9. int b;
  10. int c;
  11. }e[N];
  12. int m,n,ans;
  13. int vis[N];
  14. inline bool cmp(node x,node y) {
  15. if(x.b != y.b)
  16. return x.b < y.b;
  17. return x.a < y.a;
  18. }
  19. void init() {
  20. scanf("%d%d",&n,&m);
  21. for(int i = 1 ; i <= m ; i++)
  22. scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
  23. }
  24. void work() {
  25. sort(e+1 , e + m + 1 , cmp);
  26. for(int i = 1 ; i <= m ; i++) {
  27. int cnt = 0;
  28. for(int j = e[i].b ; j >= e[i].a ; j--) {
  29. if(vis[j]) cnt++;
  30. }
  31. if(cnt > e[i].c) continue;
  32. else {
  33. for(int j = e[i].b ; (j >= e[i].b - e[i].c + 1 && cnt < e[i].c) ; j--) {
  34. if(!vis[j]) vis[j] = 1 , cnt++ , ans++;
  35. }
  36. }
  37. }
  38. printf("%d\n",ans);
  39. }
  40. int main() {
  41. init();
  42. work();
  43. return 0;
  44. }

P1986 元旦晚会的更多相关文章

  1. P1986 元旦晚会——贪心或差分约束系统

    P1986 元旦晚会 每个人可能属于不同的声部,每个声部最少要有c[i]个人发声: 求最少需要多少话筒: 首先贪心,将所有声部的区间按照右端点大小排序,如果右端点相同,左端点从小到大排序: 贪心每次选 ...

  2. DP擎天

    DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...

  3. Do things for others

    早上,按照平常的时间去吃早饭,食堂格外的空旷,打饭的员工说今天人很少,我说昨天是有元旦晚会,她说今天是放假,我后来想,还是她说的更有道理.她看的比我清楚更清楚! 幸亏昨晚上记录下了早上要帮别人搜论文的 ...

  4. 关于我的OI生涯(AFO){NOIP2016 后}

    这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...

  5. [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,"经典不忍去的""最新近流行的",与你共享~~

    如果你是音乐爱好者: 这些歌, 请戴上耳机, 调大音量, 一个人听 ,全世界 都是你的!!!!! (一)这些歌很温暖,没有金属味,适合有阳光的午后,很悠闲... [Anaesthesia]Maximi ...

  6. css(二)

    重新排传智的首页!头部和左边的部分完成了! <!doctype html> <html lang="en"> <head> <meta c ...

  7. 软件project(五)——可行性研究

    一.目的 用最小的代价高效率的确定问题是否可以解决. 不是去解决这个问题,而是确定问题是否值得去解决.进行可行性研究简化了系统分析和系统设计的过程. 二.任务 (1)进一步分析问题定义. (2)分析员 ...

  8. 《Spring_Four》第一次作业:团队亮相

    part one: 1.队名:Spring_Four 2.团队成员组成:学号/姓名(标记团队组长) 201571030114 李蕾 201571030143 周甜甜 201571030139 张天旭( ...

  9. DIV+CSS综合实例【传智PHP首页】

    1.首页结构 2.准备工作 所有素材放到与当前网页同级的目录下: 网页背景色.背景图: 主页宽度:1000px: 创建CSS文件,将CSS文件引入到当前的HTML文件中. 3.实现 效果图: HTML ...

随机推荐

  1. android studio 怎么做屏幕适配?

    一.关于布局适配建议1.不要使用绝对布局2.尽量使用match_parent 而不是fill_parent .3.能够使用权重的地方尽量使用权重(android:layout_weight)4.如果是 ...

  2. SDOI 2019 Round1 游记

    \(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...

  3. Html和websocket初识

    一.web框架 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request(c ...

  4. Linux运维一:生产环境CentOS6.6系统的安装

    CentOS 6.6 x86_64官方正式版系统(64位)下载地址 系统之家:http://www.xitongzhijia.net/linux/201412/33603.html 百度网盘:http ...

  5. P2657 [SCOI2009]windy数

    P2657 [SCOI2009]windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B ...

  6. [应用篇]第一篇 EL表达式入门

    概念 EL表达式:EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. 作用 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的 ...

  7. 科学计算三维可视化---TVTK管线与数据加载(数据集)

    一:数据集 三维可视化的第一步是选用合适的数据结构来表示数据,TVTK提供了多种表示不同种类数据的数据集 (一)数据集--ImageData >>> from tvtk.api im ...

  8. clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别

    1. clock_gettime( ) 提供了纳秒的精确度 int clock_gettime(clockid_t clk_id, struct timespect *tp); clockid_t c ...

  9. python学习笔记5--random

    一.random模块 import random,string print(random.randint(1,199))#1-199随机取一个整数 print(string.digits) #所有的数 ...

  10. windows设置代理.bat 脚本

    按照下列脚本复制到记事本中,保存,重命名后缀为.bat,使用时双击即可. 设置代理.bat,修改下列脚本中的代理地址和端口号 @echo off echo 开始设置IE代理上网 reg add &qu ...