Acwing第50场周赛

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值