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
版权声明:本文标题:牛客周赛 round3 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732360391h1535050.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论