首页 > 其他分享 >题解1

题解1

时间:2023-01-10 20:13:23浏览次数:65  
标签:int 题解 ++ alls cnt2 cnt1 include

离散化

1.为什么要离散化

当数据很大的时候,以至于我们不能直接使用它的时候,就要考虑将其用另外一种形式表达,通常是将其映射为数组下标。

2.离散化本质

本质 : 映射

3.离散化步骤

(1) 将待离散化的数据存入数组
(2) 将该数组排序、去重
(3) 用二分函数进行区间映射,返回相应下标

注意
1.去重的原因是:用二分法本质得到的是一个数组下标,所以诸多重复元素仅仅需要一个就够,因为我们最终需要的仅仅是一个下标。
2.二分最终的return值注意是否要+1,如果题目中存在下标是 i - 1 数据,则需要加1。

4.例题 - 电影

题目链接:https://www.acwing.com/problem/content/105/

主要思想:

  • 输入数据完成后,先枚举科学家们会的语言,然后对每种语言进行计数;
  • 然后,枚举电影院,用cnt1[]cnt2[]数组分别记录每场电影的语音和字幕,分别共有多少个科学家能看懂;
  • 最后,求出所有的电影中,科学家们能听懂语音的最大数,然后根据字幕能看懂的个数,得出最后答案

代码

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int>PII;
const int N = 2e5 + 40, M = N * 3;
vector<int>alls;
int a[N], b[N], c[N], cnt[M], cnt1[N], cnt2[N];

int find(int x)
{
	int l = 0, r = alls.size() - 1;
	while(lji < r)
	{
		int mid = (l + r) >> 1;
		if (alls[mid] >= x) r = mid;
		else l = mid+ 1;
	}
	return l;
}

int main()
{
	int  n;
	cin >> n;
    //这个for循环读入所有科学家会的语言
	for (int i = 0; i < n; i ++ ) 
	{
		cin >> a[i];
		alls.push_back(a[i]);
	}
	int m;
	cin >> m;	
    //这个for循环读入每场电影语音语言
	for (int i = 0; i < m; i ++ ) 
	{
		cin >> b[i];
		alls.push_back(b[i]);
	}
    //这个for循环读入每场电影字幕语言
	for (int i = 0; i < m; i ++ ) 
	{
		cin >> c[i];
		alls.push_back(c[i]);
	}	
    //排序+去重
	sort(alls.begin(), alls.end());
	alls.erase(unique(alls.begin(), alls.end()), alls.end());		
    //这个for循环求所有科学家会的语言中,每种语言的数量
    for (int i = 0; i < n; i ++ ) 
	{
		int x = find(a[i]);
		cnt[x] ++;
	}
    //这个for循环求每场电影,语音和字幕 科学家分别各能听懂的数量
	for (int i = 0; i < m; i ++ )
	{
		int t = find(b[i]);
		int k = find(c[i]);
		cnt1[i] = cnt[t];
		cnt2[i] = cnt[k];
	}
	int m1, m2, tik;
	m1 = m2 = tik = -2e9;
    //这个for循环求能听懂语音的最大值,也就是很开心的人的最大值
	for (int i = 0; i < m; i ++ )
	{
		if (m1 < cnt1[i]) m1 = cnt1[i];
	}
	int res = 0;
   //这个for循环求既是能听懂语音的最大值,同时也就是能看懂字幕的人数的最大值(比较开心的人的最大值)
	for (int i = 0; i < m; i ++ )
	{
		if (m1 == cnt1[i])
		{
			if (tik < cnt2[i]) tik = cnt2[i], res = i + 1;
		}
	}
	cout<< res << endl;
	return 0;
}

本题主要考察对离散化本质的理解,同时考察思维性较强。

标签:int,题解,++,alls,cnt2,cnt1,include
From: https://www.cnblogs.com/Huayushanchuan/p/17041257.html

相关文章

  • charls抓包的乱码问题解决
    1.在charls的安装目录下,去修改配置文件的值----Charles.ini,内容如下   2.SSLproxysetting设置如下图  3.顺便说一下,charls抓取https的包,一定要先安......
  • docker中crontab无法执行导入计划任务问题解决
    问题描述:crontab无法执行导入计划任务解决: ⊙查看文件16进制 hexdump-c./crontab/defalut   发现有\r;crontab中只能直接\n⊙vim文件修改编码   setfile......
  • P3521 题解
    非线段树合并做法。复杂度多一只log,但是好写。跳过不重要的部分,直达核心——如何在递归时计算两棵子树互相的贡献?题解区清一色线段树合并从值域角度考虑。但是显然倍......
  • [IOI2000]邮局 题解
    简要题意线段上有\(V\)个村庄,现在要建\(P\)个邮局,使每个村庄到最近的邮局的距离之和最小。50分做法设\(dp[i][j]\)表示第一个村庄到第\(i\)个村庄,建了\(j\)个......
  • mysql delete大量数据表锁死,kill的线程后线程处于killed状态问题解决
    一、事件起因删除一张500G的表,没有添加任何约束条件,结果好久都没反应,查询锁之后,使用kill杀掉了进程,再次查询的时候,锁还在,trx_state的状态是ROLLINGBACK,使用showprocessl......
  • 网络流二十四题解题报告
    网络流二十四题解题报告\(\text{ByDaiRuiChen007}\)来源:LOJ-网络流24题机器人路径规划问题数据有误,不计入解题报告中1.飞行员配对方案问题ProblemLink构造二......
  • hidapi 编译成 dll 时出现无法解析外部符号问题解决方法
    问题现象:  解决方法: ......
  • Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
    题目链接首先看R和B的数量不等的情况(很多博弈题都是先比较两种物品的数量,相等的情况再用SG函数之类的技巧),结论是R多Alice必赢,B多Bob必赢。证明:来看R比B多的情况,定义两人......
  • 2023-2-训练赛5 题解
    Buctoj训练赛5题解(C++)A、统计单词数该题目考查对string字符串的灵活运用初步观察题目,可将解题步骤分为大致四个模块输入两行字符串由于题目要求不区分大小写,故将......
  • Namomo Winter Camp D3 Div2 简易题解
    题目提交链接ProblemK.KotlinIsland首先不用考虑描边(那样和不画这条边是一样的)。那么剩下的就是在长度和宽度内枚举了。显然可以知道长宽最多画\((n-1)/2\)和......