枚举,就是遍历所有范围,找到符合要求的数字
前缀和,对于一个给定的数组 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;
}