Codeforces Round 963 (Div. 2)

A. Question Marks

题意

就是给你一个数n和一个字符串,字符串中只有ABCD四种字符,求不超过n各种字符的和

思路

直接模拟一遍就行了

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#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 n,a=0,b=0,c=0,d=0,sum=0;
		cin>>n;
		string s;
		cin>>s;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]=='A')
			a++;
			if(s[i]=='B')
			b++;
			if(s[i]=='C')
			c++;
			if(s[i]=='D')
			d++;
		 } 
		 sum+=min(n,a);
		 sum+=min(n,b);
		 sum+=min(n,c);
		 sum+=min(n,d);
		 cout<<sum<<endl;
	}
	return 0;
}

B. Parity and Sum

题意

给你一个数组,里面可能有奇数和偶数,您可以选择任意一对 (i,j)索引,然后将较小的索引替换为它们的和,求找出使数组的所有元素具有相同奇偶性所需的最小操作数。

思路

如果数组直接是全奇数或全偶数就输出0,反之就把所有的偶数变成奇数,因为奇数加偶数等于技术但偶数加偶数还等于偶数,所以先求出最大的奇数再与比它小的偶数相加,操作数加1,如果偶数比奇数大,就让奇数加最大的偶数再进行操作,操作数加2

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int a[200100];
signed main()
{
	IOS
	int T=1;
	cin>>T;
	while(T--)
	{
		vector<int>v;
		int n,x=0,y=0,ma=0,sum=0;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i]%2==0)
			{
				x++;
				v.push_back(a[i]);
			}
			else
			{
				y++;
				if(a[i]>ma)
				ma=a[i];
			}
		}
		sort(v.begin(),v.end());
		if(x==0||y==0)
		{
			cout<<0<<endl;
			continue;
		}
		int t=v.size();
		for(int i=0;i<t;i++)
		{
				if(ma>v[i])
				{
					ma+=v[i];
					sum++;
				}
				else
				{
					ma+=v[t-1];
					ma+=v[t-1];
					t--;
					sum+=2;
					i--;
				}
				//cout<<ma<<"AAA"<<endl;
		}
		cout<<sum<<endl;
	}
	return 0;
}

C. Light Switches

题意

n个灯,每k次变化一次开关状态。每个灯从a[i],开始变化。输出最快什么时候全亮,反则不存在-1。

思路

可以先找到第一次亮灯最大的时候,让其他亮灯的时候加n个2k使与第一次亮灯最大的时候最接近,然后再排序,如果最大值减最小值大于等于k就输出-1,反之输出最大值

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int a[200100];
signed main()
{
	IOS
	int T=1;
	cin>>T;
	while(T--)
	{
		int n,k;
		cin>>n>>k;
		int mod=2*k;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		sort(a+1,a+1+n);
		for(int i=1;i<=n;i++)
		{
			if(a[n]-a[i]>=k)
			{
				int t;
				if((a[n]-a[i])%mod==0||(a[n]-a[i])%mod<k)
				a[i]=a[i]+(a[n]-a[i])/mod*mod;
				else
				a[i]=a[i]+(a[n]-a[i])/mod*mod+mod;
			}
		}
		sort(a+1,a+1+n);
		if(a[n]-a[1]>=k)
		cout<<-1<<endl;
		else
		cout<<a[n]<<endl;
	}
	return 0;
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值