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

在这里就介绍两种做法

题意:

自己看看吧,很明显的意思,就是求前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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath> #define N 30010
#define M 5050
#define INF 214748364 using 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<int > 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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 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;
}

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. More than one file was found with OS independent path 'META-INF/LICENSE' | Error:Could not read \build\intermediates\typedefs.txt (系统找不到指定的文件。)

    FAQ1: Error:Could not read E:\new\PlatformLibrary\CommonLibrary\build\intermediates\typedefs.txt: E: ...

  2. Android 5.0 Lollipop SDK下载地址(PASS)

    Android 5.0 ARM EABI v7a System Image https://dl-ssl.google.com/android/repository/sys-img/google_ap ...

  3. 微软工程师主讲的SqlServer2005视频教程

    http://www.cnblogs.com/slcfhr/archive/2008/11/24/1340283.html SQL Server 2005盛宴系列之一:SQL Server 2005产 ...

  4. BTC钱包对接流程

    BTC钱包对接流程: 部署钱包节点 分析钱包的API 通过JSON-RPC访问钱包API 部署测试 1.部署钱包节点 虚拟币交易平台对接所有的虚拟币之前,都要在自己的服务器上部署一个钱包节点,首先要找 ...

  5. 解决Anaconda4.2 Navigator打不开的问题

    参照博客:http://blog.csdn.net/k3v1n1990s/article/details/72975528?utm_source=itdadao&utm_medium=refe ...

  6. oracle进阶之分析函数

    本博客是自己在学习和工作途中的积累与总结,纯属经验之谈,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6797119.html 分 ...

  7. MySQL数据库应用 从入门到精通 学习笔记

    以下内容是学习<MySQL数据库应用 从入门到精通>过程中总结的一些内容提要,供以后自己复现使用. 一:数据库查看所有数据库: SHOW DATABASES创建数据库: CREATE DA ...

  8. 跨域问题 Uncaught DOMException: Blocked a frame with origin。。。

    第三方系统内嵌 到iframe中的 跨域问题. 解决方案: http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html

  9. HDU 5446 lucas CRT

    n中选m个模M,M为多个素数之积 $n, m, k (1 \leq m \leq n \leq 10^{18}, 1 \leq k \leq 10)$,$M = p_1 · p_2 · · · p_k ...

  10. python学习笔记4--函数/全局变量/递归

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...