牛客周赛 Round 3

游游的7的倍数

思路分析

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

时间复杂度

O(1)

代码

cpp 复制代码
#include<bits/stdc++.h>
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;
}

游游的字母串

题目大意

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

思路分析

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

时间复杂度

O(n)

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

代码

cpp 复制代码
#include<bits/stdc++.h>
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;
}

游游的水果大礼包

题目大意

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

思路分析

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

时间复杂度

O(min(n/2, m))

代码

cpp 复制代码
#include<bits/stdc++.h>
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;
}

游游的矩阵权值

题目大意

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

思路分析

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

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

时间复杂度

代码

cpp 复制代码
#include <bits/stdc++.h>
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;
}
相关推荐
Zephyrtoria1 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
柏箱4 小时前
容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
算法·bfs
Hello eveybody5 小时前
C++介绍整数二分与实数二分
开发语言·数据结构·c++·算法
Mallow Flowers7 小时前
Python训练营-Day31-文件的拆分和使用
开发语言·人工智能·python·算法·机器学习
GalaxyPokemon7 小时前
LeetCode - 704. 二分查找
数据结构·算法·leetcode
leo__5208 小时前
matlab实现非线性Granger因果检验
人工智能·算法·matlab
GG不是gg8 小时前
位运算详解之异或运算的奇妙操作
算法
FF-Studio10 小时前
万物皆数:构建数字信号处理的数学基石
算法·数学建模·fpga开发·自动化·音视频·信号处理·dsp开发
叶子爱分享11 小时前
从事算法工作对算法刷题量的需求
算法
勇闯IT11 小时前
有多少小于当前数字的数字
java·数据结构·算法