admin 管理员组

文章数量: 887007

牛客周赛 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;
}

本文标签: 牛客周赛 round3