acwing 第五十场周赛

题目一 acwing 4416. 缺少的数

给定一个长度为 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

分析

这里给定的数组中的数字是连续的,数字的范围是1e5,所以这里我们可以利用哈希表存储出现的数字,然后遍历整个哈希表找出没有出现的数字

代码部分

#include <bits/stdc++.h>
using namespace std;
int main (void)
{
	int n;
	cin>>n;
	vector<bool> hash(n+1,0);
	for(int i=1;i<=n-1;i++)
	{
		int x;
		cin>>x;
		hash[x]=1;
	}
	
	for(int i=1;i<=n;i++)
	{
		if(hash[i]==0)
		{
			cout<<i;
			break;
		}
	}
	
	return 0;
}





题目二 acwing4417. 选区间

给定 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:

3
1 5
2 6
2 3
2
2 4
6 8

输出样例1:

3

输入样例2:

3
1 5
2 6
3 7
2
2 4
1 4

输出样例2:

0

分析

首先我们来解读一下题意,就是让我们在一类区间中找出一个区间,二类区间中找出一个区间,让这两个区间的距离最大,两个区间的距离为左边的区间的右端点到右边的区间的左端点的距离,如果两个区间有重叠的部分那这两个区间的距离为0

那无非就是两种情况
第一种:第一类的区间中最小的右端点到第二类区间最大的左端点的距离
第二种:第二类的区间中最小的右端点到第一类区间最大的左端点的距离

我们分别用两次循环找出这四个值,然后找出其中最大的距离即可

代码部分

#include <bits/stdc++.h>
using namespace std;

int INF=1e9;

int main (void)
{
    int n,m;
    cin>>n;
    
    int amax=-INF,amin=INF;
    while(n--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        amax=max(amax,l);
        amin=min(amin,r);
    }
    
    int bmax=-INF,bmin=INF;
    scanf("%d ",&m);
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        bmax=max(bmax,l);
        bmin=min(bmin,r);
    }
    
   // printf("%d %d %d %d ",amax,amin,bmax,bmin);
    int ans=max(bmax-amin,amax-bmin);
    if(ans<0)
        cout<<0;
    else    cout<<ans;
    
    
    return 0;
}

题目三 acwing4418. 选元素

给定一个长度为 n 的整数序列 a1,a2,…,an。

请你从中挑选 x 个元素,要求:

原序列中的每一个长度为 k 的连续子序列都至少包含一个被选中的元素。
满足条件 1 的前提下,所选 x 个元素的相加之和应尽可能大。
输出最大可能和。

输入格式
第一行包含三个整数 n,k,x。

第二行包含 n 个整数 a1,a2,…,an。

输出格式
如果无法满足题目要求,则输出 −1。

否则,输出一个整数,表示所选元素的最大可能和。

数据范围
前三个测试点满足 1≤k,x≤n≤6。
所有测试点满足 1≤k,x≤n≤200,1≤ai≤109。

输入样例1:

5 2 3
5 1 3 10 1

输出样例1:

18

输入样例2:

6 1 5
10 30 30 70 10 10

输出样例2:

-1

输入样例3:

4 3 1
1 100 1 1

输出样例3:

100

分析

序列型动态规划,三维状态数组
等学了动态规划部分回来做

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White boy&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值