算法知识-6-刷题

枚举,就是遍历所有范围,找到符合要求的数字

前缀和,对于一个给定的数组 a,其前缀和数组 s 中,s[i] 表示原数组 a 从下标 0 到下标 i 的元素之和。

二分查找(Binary Search)是一种在有序数组中查找某一特定元素的搜索算法。其基本思想是每次将搜索区间缩小一半,通过比较中间元素与目标元素的大小关系,来确定下一步在左半区间还是右半区间继续搜索。

贪心算法(Greedy Algorithm)是在每一步选择中都采取当前看起来最优的选择,期望通过局部最优选择来达到全局最优解。贪心算法并不总是能得到最优解,但对于某些特定问题可以高效地获得较好的近似解。

5820 丰富的周日生活

每项活动都有开始时间和结束时间。小童认为参加越多的活动,自己的周日生活就越丰富。小童一向善始善终。一个活动结束前,小童不会中途退出。给出本周日各项活动的开始和结束时间表,请算算小童最多能参加多少个活动。

输入描述

第一行一个整数 n。
接下来 n 行,每行两个正整数,分别表示一项活动的开始时间和结束时间。

输出描述

一个整数,表示小童最多能够参加的活动数。

样例输入 1

5
8 13
2 11
7 9
13 16
3 8
样例输出 1

3
提示

数据范围与提示
1≤n≤1000,0<正整数≤24

#include<bits/stdc++.h>
using namespace std;
struct act{
	int s,e; //s-开始时间;e-结束时间
}a[1005];
bool cmp(act x, act y){
	return x.e<y.e;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i].s>>a[i].e;
	sort(a+1,a+n+1,cmp);
	int k=1; //用于标记选定的最后一个活动
	int cnt=1; //用于累计小童可以参加的活动数量
	for(int i=2;i<=n;i++){
		if(a[i].s>=a[k].e){
			cnt++;
			k=i;
		}
	}
	cout<<cnt;
	return 0;
}

5821 连环询问

描述

给定 n 个正整数,请快速回答 m 次连环询问。每次询问会指定一个区间 [L,R],请回答这个区间中所有正整数的和。

输入描述

第一行是正整数 n 和 m,用空格隔开。
第二行为n个正整数,数字之间用空格隔开。
接下来m行,每行两个正整数 Li,Ri ,表示一个区间。

输出描述
共m行。第i行是第i次询问的答案。

样例输入 1
4 2
4 3 2 1
1 4
2 3
样例输出 1
10
5

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],L,R; 
int main()
{
 	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i],a[i] += a[i - 1];
	while(m--)
	{
		cin >> L >> R;
		cout << a[R] - a[L - 1] << endl;
	}
    return 0;
}

3203 图书管理员

图书馆某书架,图书编号从 1 到 1000,编号都是连续的,现在图书馆需要编写一个二分查找程序,方便在系统中查找书籍。请计算当我们选定某本图书时,系统通过二分法找到这本书需要比较多少次。

输入描述

一个整数,代表书架中图书的编号。

输出描述

一个整数,表示使用二分法的比较次数。

样例输入 1
5
样例输出 1
9

提示
这里二分法取中间值的方法是,(L+R)/2,L 为图书编号范围最小值,R 为图书编号范围最大值

#include<bits/stdc++.h>
using namespace std;
int n,cnt; 
int main(){
	cin >> n;
	int left = 1,right = 1000;
	while (left <= right){
		cnt++;
		int mid = (left + right)/2;
		if(mid>n)right=mid-1;
		else if(mid<n)left=mid+1;
		else{
			break;
		}
	}
	cout << cnt;
	return 0;
}

3204 寻找最大和

给定 n 个正整数 a1,…an,请从中选择 3 个数字,满足他们的和不大于给定的整数 m,请求出这个和最大可能是多少,如果没有则输出 0。

输入描述

第一行有两个整数,分别表示数字个数 n 和给定的整数 m。
第二行有 n 个整数,表示给定的 n 个数字 ai

输出描述

输出一行一个整数表示答案。

样例输入 1
5 21
5 6 7 8 9
样例输出 1
21

样例输入 2
10 500
93 181 245 214 315 36 185 138 216 295
样例输出 2
497

#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],maxn;
int main()
{
 	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i];
	sort(a + 1,a + 1 + n);
	for(int i = 1;i <= n;i++)
	{
		for(int j = i + 1;j <= n ;j++)
		{
			for(int k = j + 1;k <= n ;k++)
			{
				if(a[i]+a[j]+a[k]<=m)maxn=max(maxn,a[i]+a[j]+a[k]);
			}
		}
	}
	cout<<maxn;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值