牛客周赛 round3

目录

1.游游的7的倍数

2.游游的字母串

3.游游的水果大礼包

4.游游的矩阵权值


1.游游的7的倍数

题目描述

游游拿到了一个正整数 x,她希望在 x 中添加一个数字,使它成为 7 的倍数。你能帮帮她吗?

输入描述:

一个正整数 x。
1≤x≤10^9

输出描述:

x添加一个数字后形成的数。请务必保证操作的合法性,且一定是7的倍数。如果有多解,输出任意一个合法解。可以证明,至少存在一个正确答案。

示例1

输入

1

输出

21

说明

在前面添加一个2即可。

示例2

输入

15

输出

105

说明

在1和2的中间添加一个0。105=15*7,合法。另外,315、154等答案也是合法的。

思路

用l和r代表数字的左部分和右部分,base代表位数,枚举每一种插入情况,直到找到结果,程序结束

代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll x;
ll l, r;//数字的左部分和右部分
ll base = 1;//位数
ll res;
int main()
{
	cin >> x;
	l = x, r = 0;
	while (l) {
		for (int i = 0; i <= 9; i++) {
			res = l * base * 10 + i * base + r;
			if (res % 7 == 0) {
				cout << res << endl;
				return 0;
			}
		}
		l /= 10;
		r += (l % 10) * base;
		base *= 10;
	}
	return 0;
}

2.游游的字母串

题目描述

对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。'a'和'b'相邻,'b'和'c'相邻,以此类推。特殊的,'a'和'z'也是相邻的。可以认为,小写字母的相邻规则为一个环。

游游拿到了一个仅包含小写字母的字符串,她想知道,使得所有字母都相等至少要多少次操作?

输入描述:

一个仅包含小写字母,长度不超过100000的字符串。

输出描述:

一个整数,代表最小的操作次数。

示例1

输入

yab

输出

3

说明

第一次操作,把'y'变成'z',字符串变成了"zab"

第二次操作,把'b'变成'a',字符串变成了"zaa"

第三次操作,把'z'变成'a',字符串变成了"aaa"

思路

枚举每一种情况(把每一个字符变为'a'~'z')找出最小的答案

代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
string s;
ll ans = 0x3f3f3f3f;
ll a;
int main()
{
	cin >> s;
	ll len = s.length();
	for (char i = 'a'; i <= 'z';i++) {
		a = 0;
		for (int j = 0; j < len; j++) {
			a += min(abs(s[j] - i), 26 - abs(s[j] - i));
		}
		ans = min(ans, a);
	}
	cout << ans << endl;
	return 0;
}

3.游游的水果大礼包

题目描述

游游有n个苹果,m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包,也可以把1个苹果和2个桃子组成价值b元的二号水果大礼包。游游想知道,自己最多能组成多少价值总和的大礼包?

输入描述:

四个正整数n,m,a,b,用空格隔开。分别代表苹果的数量、桃子的数量、一号大礼包价值、二号大礼包价值。
1≤n,m,a,b≤10^6

输出描述:

一个整数,代表大礼包的最大价值总和。

示例1

输入

3 4 1 2

输出

4

说明

组成两个二号水果大礼包,使用了2个苹果和4个桃子。总价值为4。

示例2

输入

1 1 5 6

输出

0

说明

显然无法组合成任意一个大礼包

思路

枚举第一种礼包的数量(在符合题意的情况下),计算出除了用于礼包一剩下的苹果和桃子,计算可以打包成的礼包二的数量,最后更新答案

代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll n, m, a, b, ans;
int main()
{
	cin >> n >> m >> a >> b;
	for (int i = 0; 2 * i <= n && i <= m; i++) {//i表示组合一的数量
		ll s1 = n - i * 2;//剩下的苹果
		ll s2 = m - i;//剩下的桃子
		ll j = min(s1, s2 / 2);
		ll sum = i * a + j * b;
		ans = max(ans, sum);
	}
	cout << ans << endl;
	return 0;
}

4.游游的矩阵权值

题目描述

游游定义一个矩阵权值为:每一对相邻元素之和的总和。
例如,对于矩阵:
1 2
3 4
它的权值是(1+2)+(1+3)+(2+4)+(3+4)=3+4+6+7=20。
游游希望你构造一个n∗n的矩阵,矩阵中的元素为1到n^2且每个数恰好出现一次。她希望最终矩阵的权值尽可能大。你能帮帮她吗?由于矩阵可能过大,你不需要输出最终的矩阵,只需要输出这个最大权值即可。答案对10^9+7取模。

输入描述:

一个正整数n。
2≤n≤10^9

输出描述:

矩阵的最大权值,对10^9+7取模。

示例1

输入

2

输出

20

示例2

输入

3

输出

134

思路

四个顶角的数字出现2次

四边抛去顶角的数字出现3次

中间的数字出现4次

利用等差数列求和公式可以求出答案,记得取模

代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll n;
const int mod = 1e9 + 7;
int main()
{
	cin >> n;
	ll s1 = 20;
	ll s2 = 3 * ((4 * n - 8)%mod) * ((4 * n + 1) % mod) / 2 % mod;
	ll s3 = 2 * ((n * n - 4 * n + 4)%mod) * ((n * n + 4 * n - 3) % mod) % mod;
	ll s;
	if (n >= 3) {
		s = (s1 + s2 + s3) % mod;
	}
	else {
		s = s1;
	}
	cout << s << endl;
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JalenG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值