【洛谷】 P7260 [COCI2009-2010#3] RAZGOVOR

题目链接

P7260 [COCI2009-2010#3] RAZGOVOR - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:

输入格式

输出格式

输出一个正整数,表示最小的通话次数。

思路

要想让拨打的电话数最少,显然需要让一次通话次数可以尽可能多的被更多的探测器探测到

不难想到,首先应该对数据进行排序操作,现在的问题是,如何才能让一次通话被更多的探测器探测到呢?这里可以先利用测试用例一模拟一下,看看有没有什么头绪

显然最小的通话次数是两次,可以用下图表示:

但无论如何,我们发现一个共性:在1的左侧和2的左侧,都一定会伸出一根线,这样才能满足题意,因此我们可以从这个发现做分情况讨论,讨论一下在排序后的数组中,c_{i + 1} 和  c_{i} 的大小关系。

c_{i + 1} >  c_{i} 

此时显然 一定在 i 和 i + 1之间连出一根线,否则题意无法满足。

c_{i + 1} =  c_{i} 

此时,如果在i 和i + 1之间连出一根线,则意味着从前面伸到 i 的这根线会在i + 1前截至,那么一定不是最少的通话数量

c_{i + 1} <  c_{i} 

显然,一定有一根从 i 前面延申过来的线在 i 处截至,所以一定不会有线从i 和i + 1伸出。

在以上分情况讨论的过程中,我们也顺便解决了什么时候伸出的这根线会截止的问题,即在c_{i + 1} <  c_{i} 的时候。

综上所述,此题的思路变得非常简单,只要c_{i + 1} >  c_{i} ,那么伸出的线的数量就是c_{i + 1} -  c_{i} ,只需要遍历一遍数组,累加一下伸出的线的数目即可。

AC代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10, M = 20;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int hash_num = 131;
const double eps = 1e-6;
const double pi = acos(-1);
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef long double LD;

int n, m;
vector<PII> a(N);

int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i ++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		a.push_back({x, y});
	}
	sort(a.begin(), a.end());
	int cnt = 0;
	int tmp = 0;
	for(auto t : a)
	{
		if(t.second > tmp) cnt += t.second - tmp;
		tmp = t.second;
	}
	cout << cnt;
}
//注意cnt一定要开ll,不开ll见祖宗...

类似题目

【Codeforces Round 847】D. Matryoshkas-CSDN博客

题目描述: 有一家餐馆,它的特色菜是一种叫做“Perket”的菜肴。这道菜由N种不同的香料组成,每种香料都有一个正整数的苦味值和一个正整数的美味值。每道菜需要用到至少一种香料,而且每种香料只能用一次。每道菜的苦味值是所有用到的香料的苦味值的乘积,美味值是所有用到的香料的美味值的和。现在,你需要计算出所有菜肴中苦味值和美味值的差的绝对值的最小值。 输入格式: 第一行包含整数N。 接下来N行,每行包含两个整数,表示一种香料的苦味值和美味值。 输出格式: 输出一个整数,表示所有菜肴中苦味值和美味值的差的绝对值的最小值。 输入样例: 3 1 7 2 6 3 8 输出样例: 1 解题思路: 这道题目可以使用二进制枚举的方法来解决。 首先,我们可以将所有的香料的苦味值和美味值分别存储在两个数组中。 然后,我们可以使用二进制枚举的方法来枚举所有的菜肴。具体来说,我们可以使用一个二进制数来表示一道菜肴,其中第i位为1表示这道菜肴中使用了第i种香料,为表示没有使用。 对于每一道菜肴,我们可以计算出它的苦味值和美味值,并将它们分别存储在两个数组中。 最后,我们可以枚举所有的菜肴,计算它们的苦味值和美味值的差的绝对值,并找到其中的最小值。 时间复杂度: 枚举所有的菜肴需要O(2^N)的时间复杂度,计算每道菜肴的苦味值和美味值需要O(N)的时间复杂度,因此总时间复杂度为O(2^N*N)。 参考代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值