Codeforces Round #722 (Div. 2)

Codeforces Round #722 (Div. 2)

A. Eshag Loves Big Arrays

在这里插入图片描述

Example

input

3
6
1 1 1 2 2 3
6
9 9 9 9 9 9
6
6 4 1 1 4 1

output

3
0
3

在这里插入图片描述

题目大意:

给一个数组,让你选几个元素,然后删掉比这几个元素平均值大的元素。求最多你能删掉的元素个数。

思路:

贪心,直接选择最小的数,然后不等于这个的数全部删掉。

代码:

#include<algorithm>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+7;

int a[N];

signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=0;i<n;++i)
		{
			cin>>a[i];
		}
		sort(a,a+n);
		int num=a[0];
		int ans=0;
		for(int i=0;i<n;++i)
		{
			if(a[i]!=num)++ans;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B. Sifid and Strange Subsequences

在这里插入图片描述

Example

input

6
4
-1 -2 0 0
7
-3 4 -2 0 -4 6 1
5
0 5 -3 2 -5
3
2 3 1
4
-3 0 2 0
6
-3 -2 -1 1 1 1

output

4
5
4
1
3
4

在这里插入图片描述

题目大意:

给一个数组,求最长子数组,且它每个数作差的绝对值一定要大于或等于全部数字中的最大值。

思路:

观察样例,我们发现被删去的总是原来数组里的最大值,确实,只要尽可能的把最大值删去,就越可能符合要求。

要符合要求,就得让 最近的每对数的差尽量大,最大值尽量小。所以我们先升序排序,这样相邻的数字就是最近的,自然最后一个数字就是最大值。所以我们O(n)遍历,只要不符合,就舍去最大,让其等于次大。

代码:

#include<algorithm>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+7;

int a[N];

signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=0;i<n;++i)
		{
			cin>>a[i];
		}
		sort(a,a+n);
		int k=n-1;//最大值的位置
		int Max=a[k];
		int ans=0;
		for(int i=0;i<k;++i)
		{
			if(abs(a[i]-a[i+1])>=Max)
			{
				++ans;
			}
			else
			{
				Max=a[--k];
				--i;
			}
			
		}
		cout<<ans+1<<endl;
	}
	return 0;
}

C待补充

D. Kavi on Pairing Duty

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Examples

input

1

output

1

input

2

output

3

input

3

output

6

input

100

output

688750769

在这里插入图片描述
在这里插入图片描述
思路:
看n等于3时,可以把情况分为两种,一种是 存在一个包含关系,另一种则是相反的情况。
1.先考虑有包含时,比如上面那幅图,第2,3,5行,其实就是当n=2时的情况之数,再看第4行,其实就是n=1时的情况之数。
2.看第1行和第6行,红色的线占了1格和3格,其实就是有n的约数个情况。

代码:

#include<iostream>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e6+7;
void fastio(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);}
const int MOD=998244353;

int a[N],b[N]={0,1};

signed main()
{
	fastio();
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)//倍数法求约数个数
	{
		for(int j=1;j*i<=n;++j)
		{
			a[j*i]++;
		}
	}
	for(int i=2;i<=n;++i)
	{
		b[i]=(a[i]+(2*b[i-1])%MOD)%MOD;
	}
	cout<<(b[n]-b[n-1]+MOD)%MOD<<endl;
	return 0;
}

有些地方可能没讲清楚,看看能不能给一些启发吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值