T1:缺少的数
给定一个长度为 n−1 的数列 a1,a2,…,an−1。
数列中的元素两两不同,且都在 1∼n 的范围内。
请你计算,1∼n 中的哪一个数没有在数列中出现过。
输入格式
第一行包含一个整数 n。
第二行包含 n−1 个整数 a1,a2,…,an−1。
输出格式
输出 1∼n 中没有在数列中出现过的数。
数据范围
前三个测试点满足 2≤n≤10。
所有测试点满足 2≤n≤105,1≤ai≤n。
输入样例:
10
3 8 10 1 7 9 6 5 2
输出样例:
4
这个题目之前有遇到过类似的,所以很容易九会想到思路。先算连续的1-n的数字之和。然后减去n-1个数,得到的值便是数列中没有出现的。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
long long res=(1+n)*n/2;
int a[n];
for(int i=1;i<n;i++){
cin>>a[i];
res-=a[i];
}
cout<<res<<endl;
}
T2:选区间
给定 n 个一类区间 (l1,i,r1,i)。
给定 m 个二类区间 (l2,i,r2,i)。
请你从一类区间中挑选一个区间,从二类区间中挑选一个区间。
要求,选出的两个区间之间的距离尽可能大。
请你输出最大可能距离。
关于两区间 (l1,r1) 和 (l2,r2) 之间的距离,我们规定:
如果两区间存在交集,则区间距离为 0。
如果两区间不存在交集,则区间距离为 |i−j| 的最小可能值,其中 l1≤i≤r1,l2≤j≤r2。
输入格式
第一行包含一个整数 n。
接下来 n 行,每行包含两个整数 l1,i,r1,i。
再一行包含一个整数 m。
最后 m 行,每行包含两个整数 l2,i,r2,i。
输出格式
一个整数,表示最大可能距离。
数据范围
前三个测试点满足 1≤n,m≤10。
所有测试点满足 1≤n,m≤2×105,1≤l1,i≤r1,i≤109,1≤l2,i≤r2,i≤109。
这个题的思路是:1、找出第一类区间的下限和上限。
2、在第二类区间中有两种情况:一是左限的值小于第一类区间的下限,这样距离值就是区间左限减去第一类的下限。
而是右限小于第一类的上限,距离值等于第一类上限减去有限。在第二类区间中不断比较更新最大距离值即可。
#include <iostream>
using namespace std;
int n, m;
int l, r, ans;
int a, b;
int main(void)
{
cin >> n;
a = 1e10, b = -1e9;
while(n--)
{
cin >> l >> r;
a = min(a, r);
b = max(b, l);
}
cin >> m;
while(m--)
{
cin >> l >> r;
if(a < l) ans = max(ans, l - a);
if(b > r) ans = max(ans, b - r);
}
cout << ans << endl;
return 0;
}