Codeforces Round 963 (Div. 2)(A~C题解)

A. Question Marks

思路:用一个map统计a,b,c,d的出现次数,然后在最后计算总分的时候只需要去看,当前选项的出现次数和n去最小值即可

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define pb push_back
int t;
int n;
int a[200005];
string s;
signed main()
{
	cin>>t;
	while(t--)
	{
		map<char,int>mp;
		cin>>n;
		cin>>s;
		for(int i=0;i<s.size();i++)
		{
			mp[s[i]]++;
		}
		int sum=min(n,mp['A'])+min(n,mp['B'])+min(n,mp['C'])+min(n,mp['D']);
		cout<<sum<<"\n";
	}
	return 0;
}

 B. Parity and Sum

思路:我们会发现,经过上述的操作,产生的结果一定是一个奇数,因此,我们 我们可以知道,要是一开始奇偶性就是相同的话,那么操作次数为0,否则,我们就选取最大的奇数和最大的偶数,然后遍历数组,最大的奇数在遍历偶数的时候顺便要进行累加,然后碰到比它大的数,就相当于让他先去加上最大的偶数(最大奇数+最大偶数,一定是最大的)这种情况计数+2即可

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define pb push_back
int t;
int n;
int a[200005];
int maxn;//最大奇数
int ou;//最大的偶数 
signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
    cout.tie(0);

	cin>>t;
	while(t--)
	{
		maxn=0;
		int cnt=0;
		int cnt1=0,cnt2=0;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i]%2==1)
			{
				maxn=max(maxn,a[i]);
				cnt1++;
			}
			else
			{
				ou=max(ou,a[i]);
				cnt2++;
			} 
		}
		if(maxn==0)
		{
			cout<<0<<'\n';
			continue;
		}
		sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        {
            if(a[i]%2==0&&maxn>a[i])
            {
                maxn+=a[i];
                cnt++;
            }
            else if(a[i]%2==0)
            {
                if(maxn<=a[i])
                {
                    cnt+=2;maxn+=ou;
                }
            }
        }
        cout<<cnt<<"\n";
	}
	return 0;
}

C. Light Switches 

思路:一个纯模拟题目吧,感觉不涉及数学的啥东西,如果说涉及,那我觉得就是计算,都是小学的计算方式

我们先将其亮灯时间进行排序,找到最晚一个开灯的

我们只需要现将最后一个灯泡的第一次的亮灯区间假设为整体的亮灯区间,因为后续无论经历多少了时间,其都是相同的,所以只需要考虑第一个亮灯区间 

也就是a[n]~a[n]+k-1这个区间,然后我们从前到后去遍历,除了最后一个灯泡,然后我们给其都通过加2*k这种一整个区间,使其能够和最后一个灯泡的区间有重叠部分,然后左区间选最大,右区间选最小,如果左区间>右区间,那就证明肯定不可能同时开了,输出-1,否则直接输出左边界即可

#include <bits/stdc++.h>  
using namespace std;  
int t;
int n, k;
int a[200005]; 
#define int long long 
#define pb push_back
int Max(int a,int b)
{
	return a>b?a:b;
}
int Min(int a,int b)
{
	return a<b?a:b;
}
void put(int l,int r)
{
	if (l <= r)  
    {  
        cout<<l<<"\n";  
    }  
    else  
    {  
        cout<<-1<<"\n";  
    }  
}

void solve()
{
	cin >> n >> k; 
    for (int i = 1; i <= n; i++)  
    cin>>a[i];
    sort(a+1,a+n+1);
    int l=a[n],r=a[n]+k-1; 
    for (int i=1;i<n;i++)  
    {    
        a[i]+= (a[n] - a[i])/(2 * k)*(2 * k);
        if (a[i]+k <l+1)  
        {  
            a[i] += k<<1;
        }
        l = Max(l, a[i]);  
        r = Min(r, a[i]+k-1);  
    }  
    put(l,r);
}
signed main()  
{  
    ios_base::sync_with_stdio(0);
	cin.tie(0);
    cout.tie(0);
    cin>>t; 
    while (t--) 
    {  
       solve();
    }  
    return 0; 
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值