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

在这里就介绍两种做法

题意:

自己看看吧,很明显的意思,就是求前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. bzoj 3667 Rabin-Miller算法

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...

  2. (转)log4j(六)——log4j.properties试过过程详解

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 参考:https://www.cnblogs.com/ywlaker/p/6124067.html log4j基本用法 首 ...

  3. jquery如何实现点击LI标签和下面的LI互换顺序? 超简单代码

    转: jquery如何实现点击LI标签和下面的LI互换顺序? 上面的效果涉及jquery的两个方法: next()  :  获得匹配元素集合中每个元素紧邻的下一个同胞元素. after() :在被选元 ...

  4. Linux发不出分片包的问题分析

    今日有个网络攻击模拟需求,要打分片的ip包,程序写好了,在开发机上验证也没问题,然后部署到沙盒环境之后不行,就是发不出来数据包,而不分片的数据包能够正常发送,定位过程如下 1.对比了两台机器/proc ...

  5. Chapter9(顺序容器) --C++Prime笔记

    PS:删除元素的成员函数并不检查其参数.在删除元素之前,程序员必须确保它们是存在的. 1.迭代器的范围是[begin,end)左闭右开. 2.对构成迭代器的要求: ①它们指向同一个容器中的元素或者容器 ...

  6. linux命令总结之dig命令

    Dig简介: Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具.Dig的源码是ISC BIND大包的一部分,但是大多编译和安装Bind的文档都不把它包括在内 ...

  7. KVM管理概述

    一.使用QEMU管理虚拟机 1.KVM指南 https://activedoc.opensuse.org/book/opensuse-virtualization-with-kvm/part-iii- ...

  8. openstack指南

    1.openstack官网 http://www.openstack.org/ 2.openstack源码地址 https://github.com/openstack 3.openstack的pac ...

  9. 批量更新demo

    因为批量更新数据库的时候,如果数据量太多,就会报错,这时候可以通过逻辑,批量更新,demo如下 @Test public void testbatch() { /** * 批量的值 */ int ma ...

  10. 如何创建一个https的站点(超简单) 以及 IIS7.5绑定Https域名

    1.申请免费1年的ssl证书(传送门:https://common-buy.aliyun.com/?spm=5176.2020520163.cas.29.N0xOPM&commodityCod ...