牛客周赛 Round 3

游游的7的倍数

牛客周赛 Round 3_第1张图片牛客周赛 Round 3_第2张图片

思路分析

添加一个数让其为7的倍数。倍数,每7个中必有一个是7的倍数,在末尾添加一个数即可.遍历0-6,满足既可。

时间复杂度

O(1)

代码

#include
using namespace std;
using ll=long long;
int main()
{
    ll x;
    cin>>x;
    x=x*10;
    for(int i=0;i<=6;i++)
    {
        if((x+i)%7==0)
        { cout<<x+i<<endl;
            return 0;}
    }
    return 0;
}

游游的字母串

牛客周赛 Round 3_第3张图片牛客周赛 Round 3_第4张图片

题目大意

游游有一个仅包含小写字母的字符串。她想知道,最少需要多少次操作才能使得所有字母都变成相同的字母。每一次操作,她可以将某个字母变成其相邻的字母(按照小写字母环的规则进行变化)。

思路分析

因为字符串长度范围较小所以可以直接遍历所有可能字母。对于每个可能的目标字母,遍历字符串中的每个字母,并累加将该字母变成目标字母所需的最小操作次数。在累加过程中,我们需要考虑两种情况:字母间的顺时针操作和逆时针操作。然后比较不同目标字母下的最小操作次数,取其中的最小值作为最终结果。

时间复杂度

O(n)
假设字符串的长度为n,最外层的循环遍历了26个字母(常数级),内层的循环遍历了字符串的每个字符,时间复杂度为O(n)。因此,总的时间复杂度为O(26n),即O(n)。

代码

#include
using namespace std;
const int ;
void solve()
{
  string s;
    cin>>s;
    int n=s.length();
    int res=n*26;
    for(int i='a';i<='z';i++)
    {
        int ans=0;
        for(int j=0;j<n;j++)
        {
            ans+=min(abs(s[j]-i),26-abs(s[j]-i));
        }
        res=min(res,ans);
    }
    cout<<res<<endl;
    return;
}
signed main()
{
    solve();
     return 0;
}

游游的水果大礼包

牛客周赛 Round 3_第5张图片牛客周赛 Round 3_第6张图片

题目大意

游游有n个苹果和m个桃子,可以用2个苹果和1个桃子组成价值a元的一号大礼包,也可以用1个苹果和2个桃子组成价值b元的二号大礼包。要求求出能组成的最大价值总和。

思路分析

枚举一号大礼包的所有情况,按剩下的计算二号大礼包。

时间复杂度

O(min(n/2, m))

代码

#include
using namespace std;
#define int long long
signed main()
{
    int n,m,a,b;
    cin>>n>>m>>a>>b;
    int num=min(n/2,m);
    int ans=0;
    for(int i=0;i<=num;i++){
      int res=i*a;
    res+=min(n-2*i,m-i>>1)*b;
        ans=max(ans,res);
    }
    cout<<ans<<endl;
    return 0;
}

游游的矩阵权值

牛客周赛 Round 3_第7张图片在这里插入图片描述

题目大意

题目要求构造一个nxn的矩阵,矩阵中的元素为1到n^2且每个数恰好出现一次。并且希望使得矩阵的权值尽可能大,其中权值定义为矩阵中每一对相邻元素之和的总和。

思路分析

观察位置发现四个角要加两次,外面四边要加三次,里面元素要加四次。所以要使矩阵权值最大,值越大往里放。(边计算边取模)

  • 四个角:1,2,3,4,权值相加和为10*2
  • 四条边+四个角权值和为3*(4n-4+1)%mod(2*n-2)-10
  • 里面元素:((n-2)(n-2))%mod2%mod*(2nn%mod-num+1)%mod

时间复杂度

代码

#include 
using namespace std;
const int mod=1e9+7;
#define int long long 
signed main (){
    int n;
    cin>>n;
     int ans=3*(4*n-4+1)%mod*(2*n-2)-10;
     ans%=mod;
     ans=(ans+mod)%mod;
     int num=(n*n+4-4*n)%mod;//

    ans=(ans+num%mod*2%mod*(2*n*n%mod-num+1)%mod)%mod;   
    ans=(ans+mod)%mod;
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(算法)