ACM程序设计课内实验(4)查找

2023-12-07 10:36

本文主要是介绍ACM程序设计课内实验(4)查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

补充知识

upper_bound()与lower_bound()使用方法

•都是二分函数,头文件<algorithm>

• upper_bound返回第一个大于的元素的下标;

• lower_bound返回第一个大于等于元素的下标;

1.二分查找

Description

有n(1<=n<=1000005)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请找出序列中第1个大于x的数的下标!

Input

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和x,第二行是已经有序的n个整数的数列。

Output

对于每个测试实例,请找出序列中第1个大于x的数的下标!。

Sample Input

3 3
1 2 4

Sample Output

2

Hint

本题为多组数据,while(scanf("%d%d",&n,&m)!=-1)即可

 库函数求解

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int n, x;while (cin >> n >> x) {vector<int> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}int index = lower_bound(nums.begin(), nums.end(), x) - nums.begin();cout << index << endl;}return 0;
}

手写二分

#include <iostream>
#include <vector>using namespace std;int findFirstLargerIndex(const vector<int>& nums, int x) {int left = 0;int right = nums.size() - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > x) {result = mid;right = mid - 1;} else {left = mid + 1;}}return result ; // Adding 1 to get the 1-based index
}int main() {int n, x;while (cin >> n >> x) {vector<int> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}int result = findFirstLargerIndex(nums, x);cout << result << endl;}return 0;
}

2.查找出现次数

Description

给你n个int类型的数,让你统计出现次数最多的数字及次数?

Input

输入1个N (1<=N<=20),数字值的范围【1,100】

Output

输出出现次数最多的数字及次数

Sample Input

8
2 2 2 2 3 3 56 7

Sample Output

2 4
#include <iostream>
#include <unordered_map>
using namespace std;int main() {int n;cin >> n;int arr[n];for (int i = 0; i < n; i++) {cin >> arr[i];}unordered_map<int, int> count_map;for (int i = 0; i < n; i++) {count_map[arr[i]]++;}int max_count = 0;int max_num = 0;for (auto it = count_map.begin(); it != count_map.end(); it++) {if (it->second > max_count) {max_count = it->second;max_num = it->first;}}cout << max_num << " " << max_count << endl;return 0;
}

3.小清新的二分查找之旅 

Description

小清新又在疯狂懵逼了,遇到了一道题,并且发誓绝对不会告诉别人:在题号899的题目上脸懵逼了好久,于是他决定强化一下题目900,以抒发心中的抑郁之气。所以……
给出一组整数,整数个数为n,n不超过1,000,000,问这组整数中是否有k,总共询问q次。

Input

多组输入。
每组输入输入:
第一行2个整数:n q ,1 <=q , n <= 1,000,000 。
第二行 有 n 个整数,已升序排序。所有数 <= 1 e 9+7.
第三行 有 q 个整数,用于查询。
每行各数据之间有空格隔开。

Output

对每个查询数据分别输出一行
存在输出:
no
不存在输出:
YES

Sample Input

5 2
1 2 3 4 5
2 10

Sample Output

no
YES
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n, q;while (cin >> n >> q) {vector<int> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}for (int i = 0; i < q; ++i) {int k;cin >> k;if (binary_search(nums.begin(), nums.end(), k)) {cout << "no" << endl;} else {cout << "YES" << endl;}}}return 0;
}

手写二分

#include <bits/stdc++.h>
using namespace std;
int n,q,k,i,l,r,m,a[1000010];
bool judge(int l,int r,int cmp)
{while(l<=r){m=l+(r-l)/2;if(a[m]>cmp) r=m-1;if(a[m]<cmp) l=m+1;if(a[m]==cmp) return 1;}return 0;
}
int main()
{ios::sync_with_stdio(false);while(cin>>n>>q){for(i=1;i<=n;i++)cin>>a[i];while(q--){cin>>k;if(judge(1,n,k))printf("no\n");else printf("YES\n");}}return 0;
}

4.找自己

Description

给出一个无序数列a且数列a中无重复元素,给出该数列a中的某个元素x,求出该元素在该数列a的降序排列中所处的位置。

Input

测试数据只有一组,第一行输入两个整数n,(1 <= n <= 500000),m(0< m <= 10^9 ),n表示该数列a中元素的个数,m表示需要测试元素x的个数,第二行为n个整数,空格间隔,为数列a中的元素,接下来的m行,每行输入一个整数x,表示序列a中某个元素x。

Output

对于每次输入的x,输出相应x在a的降序排列中所处的位置。每个输出占一行。

Sample Input

6 3
3 1 4 5 9 2
9
5
2

Sample Output

1
2
5
#include <vector>
#include <bits/stdc++.h>
using namespace std;int main() {int n, m;ios::sync_with_stdio(false);//加速时间scanf("%d %d", &n, &m);vector<int> a(n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}sort(a.begin(), a.end(), greater<int>());while (m--) {int x;scanf("%d", &x);auto it = lower_bound(a.begin(), a.end(), x, greater<int>());printf("%d\n", it - a.begin() + 1);}return 0;
}

5.找字符串

Description

程序完成在一些已知字符串中查找含有“*”最多的字符串的功能。要求用返回指针值的函数完成:找到这个字符串,函数返回“*”最多的字符串的首地址,若所有字符串中均不含“*”,则返回NULL。并将找到的字符串输出。
要求:用返回指针值的函数完成查找,在main中将其输出。

Input

put :输入数据有多组,每组包括两行,第一行1个整数n,表示n个各不相同的字符串(n<=100);第二行是n个长度不超过50的字符串,每个之间用空格分隔。

Output

 将找到的字符串输出。每个一样输出。

Sample Input

4abc*kie** *kdiei*kdi*ki** i*9k*kiei* iie
5
abc  iie*ki*  kie***** *kidi* 909*

Sample Output

*kdiei*kdi*ki**
kie***** 
#include <stdio.h>
#include <stdlib.h>int len(char *p) {int i = 0, ans = 0;while (p[i] != '\0') {if (p[i] == '*') ans++;i++;}return ans;
}char *js(char *p[101], int n) {int i, num = 0, k = 1;for (i = 1; i <= n; i++) {int tp = len(p[i]);if (num < tp) {num = tp;k = i;}}return p[k];
}int main() {char a[101][51];char *p[101];int n, i;while (scanf("%d", &n) != -1) {for (i = 1; i <= n; i++) {p[i] = (char *)malloc(51 * sizeof(char));scanf("%s", p[i]);}char *ans = js(p, n);printf("%s\n", ans);}return 0;
}

 

这篇关于ACM程序设计课内实验(4)查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465538

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Win8下如何快速查找和删除电脑中的病毒

Win8系统如何查找和删除病毒?检查你的电脑是否存在病毒的一种快速方法是使用 Windows Defender. 此恶意软件防护随 Windows 提供,可帮助识别和删除病毒、间谍软件和其他恶意软件。   注意:如果你使用的是 Windows RT,则 Windows Defender 会始终启用,并且不能关闭。   如果你使用的是 Windows 8,则可以根据自己的喜好运行由其他

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序