Codeforces Round #533 (Div. 2) 部分题解

A:

题目:

传送门A

题意:

给出一串数组,每个数字s可以变成任何数x,花费为abs(x-s),求一个数字t,使数组中的每个元素满足(t-s)<=1,求变成这样的最小花费为多少。

思路:
 

直接暴力即可,因为数据比较小。

代码如下:
 

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn];
int n;
int main()
{
    int sum=0;
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    sort(a,a+n);
    int ans=0x3f3f3f3f,tar;
    for (int i=a[0];i<=a[n-1];i++)
    {
        int t=0;
        for (int j=0;j<n;j++)
        {
            if(abs(i-a[j])>1)
            t+=abs(i-a[j])-1;
        }
        if(ans>t)
        {
            ans=t;
            tar=i;
        }
    }
    printf("%d %d\n",tar,ans);
    return  0;
}

B:

题目:
 

传送门B

题意:
 

给出一个字符串,和一个数字k,当字符串中有连续的k个相等的字符时,字符串的等级+1,求字符串的最高等级。

思路:

暴力跑一遍。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=2*1e5+5;
char s[maxn];
int n,k;
int main()
{
    scanf("%d%d",&n,&k);
    scanf("%s",s);
    map<char,int>ma;
    int ans=0;
    for (int i=0;i<n;i++)
    {
        int sum=1;
        int j=i;
        char c=s[i];
        while (i<n-1&&s[j]==s[j+1]&&sum<k)
        {
            j++;
            sum++;
        }
        i=j;
        if(sum>=k)
        {
            ma[c]++;
            ans=max(ans,ma[c]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

C:

题目:

 传送门C

题意:

给出一个范围l,r,求在这个范围组成的数字能满足数字之和为3的倍数的组合种类。

思路:

先将l到r范围内的各个余数的个数求出来,然后进行dp,设一个dp数组dp[n][3],dp[x][y]表示x个数能组成余数为y的种类数,dp数字有如下的递推式子:

        dp[i][0]=(dp[i-1][0]*a[0]+dp[i-1][1]*a[2]+dp[i-1][2]*a[1])%Mod;
        dp[i][1]=(dp[i-1][0]*a[1]+dp[i-1][1]*a[0]+dp[i-1][2]*a[2])%Mod;
        dp[i][2]=(dp[i-1][0]*a[2]+dp[i-1][1]*a[1]+dp[i-1][2]*a[0])%Mod;

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const ll Mod=1e9+7;
const int maxn=2*1e5+5;
ll n,l,r;
ll a[3];
ll dp[maxn][3];
int main()
{
    scanf("%lld%lld%lld",&n,&l,&r);
    a[0]=a[1]=a[2]=(r-l+1)/3;
    ll yu=(r-l+1)%3;
    if(yu)
    {
        if(yu==1)
        {
            a[l%3]++;
        }
        else
        {
            a[l%3]++;
            a[(l+1)%3]++;
        }
    }
    dp[1][0]=a[0];
    dp[1][1]=a[1];
    dp[1][2]=a[2];
    for (int i=2;i<=n;i++)
    {
        dp[i][0]=(dp[i-1][0]*a[0]+dp[i-1][1]*a[2]+dp[i-1][2]*a[1])%Mod;
        dp[i][1]=(dp[i-1][0]*a[1]+dp[i-1][1]*a[0]+dp[i-1][2]*a[2])%Mod;
        dp[i][2]=(dp[i-1][0]*a[2]+dp[i-1][1]*a[1]+dp[i-1][2]*a[0])%Mod;
    }
    printf("%lld\n",dp[n][0]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/86570883