Codeforces Round 969 (Div. 2)


题目链接

A. Dora’s Set

题意:

给你一个区间,从区间内选择3个数使两两的最大公约数为1,每个数只能用一次

思路:

我们找规律可以发现只要两个奇数加中间的偶数这3个数就可以满足条件,所以就可以先统计区间奇数的个数,最终结果就是奇数除2

代码

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

signed main()
{
	IOS
	int T=1;
	cin>>T;
	while(T--)
	{
		int l,r,sum=0,t=0;
		cin>>l>>r;
		while(l<=r)
		{
			if(l%2==1)
			sum++;
			l++;
		}
		cout<<sum/2<<endl;
	}
	return 0;
}

B. Index and Maximum Value

题意:

给你一个数组,给你一个区间,如果数组里面值满足区间,就进行加1或减1操作

思路:

我们只需要找到原始数组里面的最大值,如果最大值在区间,就改变最大值加1或减1最后输出就最大值就好了

代码:

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

signed main()
{
	IOS
	int T=1;
	cin>>T;
	while(T--)
	{
		int l,r,ma=0,a,m,n;
		cin>>m>>n;
		char s;
		for(int i=1;i<=m;i++)
		{
			cin>>a;
			if(a>ma)
			ma=a; 
		}
		while(n--)
		{
			cin>>s>>l>>r;
			if(ma>=l&&ma<=r)
			{
				if(s=='+')
				ma+=1;
				else
				ma-=1;
			}
			cout<<ma<<" ";
		}
		cout<<endl;
	}
	return 0;
}

C. Dora and C++

题意:

给你一个数组,还有a,b,每次可以给数组里面的值加a或b求极差的最小值

思路:

一开始我这个题也没有思路,但经过大量的找规律,就发现a和b的最大公约数与这个题有关,所以就找到了一种规律吧,先求一下a和b的最大公约数,然后把数组求余最大公约数,再把数组排序,让mi等于极差,然后再遍历一下数组,把m[i]加最大公约数减m[i+1]与mi求最小值,最后mi就是结果。

代码:

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int m[201000];
signed main()
{
	IOS
	int T=1;
	cin>>T;
	while(T--)
	{
		int n,a,b,mi=0,p=0;
		cin>>n>>a>>b;
		int t=__gcd(a,b);
		//cout<<t<<endl;
		for(int i=1;i<=n;i++)
		{
			cin>>m[i];
			m[i]%=t;
			//cout<<m[i]<<" ";
		}
		sort(m+1,m+1+n);
		mi=m[n]-m[1];
		for(int i=1;i<n;i++)
		{
			if(m[i]+t-m[i+1]<mi)
			mi=m[i]+t-m[i+1];
		}
		//cout<<endl;
		//sort(m+1,m+1+n);
		//cout<<m[n]<<" "<<m[1]<<endl;
		cout<<mi<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值