游游的7的倍数
思路分析
添加一个数让其为7的倍数。倍数,每7个中必有一个是7的倍数,在末尾添加一个数即可.遍历0-6,满足既可。
时间复杂度
O(1)
代码
#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)。
代码
#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))
代码
#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))%mod2%mod*(2nn%mod-num+1)%mod
时间复杂度
代码
#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;
}