赛事热议
#蓝桥杯
蓝桥这次算是废了,这是赛后整理的个人写的一些代码,如有错误请大家斧正hh,也希望大佬可以分享一下自己的代码供本人参考一下😀😀😀。
A:1204
B:没看
C:(暴力)
【问题描述】
一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上
的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称
之为“好数”。
给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
【输入格式】
一个整数 N。
【输出格式】
一个整数代表答案。
【样例输入 1】
24
【样例输出 1】
7
【样例输入 2】
2024
【样例输出 2】
150
【样例说明】
对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。
【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ N ≤ 100。
对于 100% 的评测用例,1 ≤ N ≤ 107 。
代码
#include <iostream>
using namespace std;
int res = 0;
bool check(int x){
int k = 1;
while (x) {
int kk = x % 10;
if (k % 2 == 1 && kk % 2 == 1) {
k++;
x /= 10;
} else if (k % 2 == 0 && kk % 2 == 0){
k++;
x /= 10;
} else {
return false;
}
}
return true;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
if (check(i)) res++;
}
cout << res;
return 0;
}
D:R格式(高精度乘法,没用这个写,个人感觉细节容易错误,想看看大家的代码)
【问题描述】
小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R
格式整数的做法是:
- 将浮点数乘以 2^n
- 四舍五入到最接近的整数。
【输入格式】
一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮
点数。
【输出格式】
输出一行表示答案:d 用 R 格式表示出来的值。
【样例输入】
2 3.14
【样例输出】
13
【样例说明】
3.14 × 22 = 12.56,四舍五入后为 13。
【评测用例规模与约定】
对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。
对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度
≤ 1024;保证 d 是小数,即包含小数点。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
void mul(vector<int> &ver)
{
int t=0;
for(auto &x:ver)
{
x=x*2+t;
t=x/10;
x=x%10;
}
if(t) ver.push_back(t);
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin >> n;
string s;
cin>>s;
reverse(s.begin(),s.end());
vector<int> ver;
int flag=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='.')
{
flag=i;
continue;
}
else
{
ver.push_back(s[i]-'0');
}
}
while(n--)
{
mul(ver);
}
reverse(ver.begin(),ver.end());
// for(auto x:ver) //debug
// {
// printf("%d ",x);
// }
// puts("");
int bak=-1;
while(flag--)
{
bak=ver.back();
ver.pop_back();
}
if(bak>=5)
{
reverse(ver.begin(),ver.end());
int flag=1;
for(int i=0;i<ver.size();i++)
{
ver[i]+=flag;
flag=ver[i] / 10;
ver[i]=ver[i] % 10;
}
if(flag) ver.push_back(flag);
reverse(ver.begin(),ver.end());
}
for(auto x:ver) printf("%d",x);
return 0;
}
E:数字接龙(dfs)
【问题描述】
小蓝最近迷上了一款名为《数字接龙》的迷宫游戏,游戏在一个大小为N × N 的格子棋盘上展开,其中每一个格子处都有着一个 0 . . . K − 1 之间的整
数。游戏规则如下:
- 从左上角 (0, 0) 处出发,目标是到达右下角 (N − 1, N − 1) 处的格子,每一步可以选择沿着水平/垂直/对角线方向移动到下一个格子。
- 对于路径经过的棋盘格子,按照经过的格子顺序,上面的数字组成的序列要满足:0, 1, 2, . . . , K − 1, 0, 1, 2, . . . , K − 1, 0, 1, 2 . . . 。
- 途中需要对棋盘上的每个格子恰好都经过一次(仅一次)。
- 路径中不可以出现交叉的线路。例如之前有从 (0, 0) 移动到 (1, 1),那么再从 (1, 0) 移动到 (0, 1) 线路就会交叉。为了方便表示,我们对可以行进的所有八个方向进行了数字编号,如下图2 所示;因此行进路径可以用一个包含 0 . . . 7 之间的数字字符串表示,如下图 1是一个迷宫示例,它所对应的答案就是:41255214。现在请你帮小蓝规划出一条行进路径并将其输出。如果有多条路径,输出字典序最小的那一个;如果不存在任何一条路径,则输出 −1。
### 【输入格式】
第一行包含两个整数 N、K。
接下来输入 N 行,每行 N 个整数表示棋盘格子上的数字。
### 【输出格式】
输出一行表示答案。如果存在答案输出路径,否则输出 −1。
### 【样例输入】
3 3
0 2 0
1 1 1
2 0 2奇淫巧计爆搜奇淫巧计爆搜
### 【样例输出】
41255214
### 【样例说明】
行进路径如图 1 所示。
### 【评测用例规模与约定】
对于 80% 的评测用例:1 ≤ N ≤ 5。
对于 100% 的评测用例:1 ≤ N ≤ 10,1 ≤ K ≤ 10。
## 代码
// 1、错误代码:第一:只需要搜一次,否则会爆;二来是如果k=1的时候,这样写也是错误的
// #include <iostream>
// using namespace std;
// const int N = 20;
// int a[N][N];
// bool st[N][N];
// int n, k, num;
// string s;
// int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
// void dfs(int kk, string ss, int xx,int yy,int kkk){
// if (xx == n && yy == n) {
// if (kk == num)
// {
// if (s.empty()) s = ss;
// else s = min(s, ss);
// }
// return;
// }
// for (int i = 0; i < 8; i++) {
// int x = dx[i] + xx, y = dy[i] + yy;
// if (x >= 1 && x <= n && y >= 1 && y <= n && (!st[x][y]) && (!st[x][yy] || !st[xx][y]) && a[x][y] == kkk) {
// st[x][y] = true;
// string sss = ss;
// sss.push_back(char('0' + i));
// dfs(kk + 1, sss, x, y, (kkk + 1) % k);
// st[x][y] = false;
// // cout << sss << '\n';
// }
// }
// }
// int main()
// {
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
// cin >> n >> k;
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= n; j++) {
// cin >> a[i][j];
// }
// }
// if (a[1][1] != 0){
// cout << -1;
// return 0;
// }
// st[1][1] = true;
// num = n * n;
// dfs(1, s, 1, 1, 1);
// if (s.empty()) cout << -1;
// else cout << s;
// return 0;
// }
#include <iostream>
using namespace std;
const int N = 20;
int a[N][N];
bool st[N][N], vis[N][N][N][N];
int n, k, num;
string s;
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
void dfs(int kk, string ss, int xx,int yy,int kkk){
if (!s.empty()) return;
if (xx == n && yy == n) {
if (kk == num)
{
s = ss;
}
return;
}
int aim = (kkk+1) % k;
for (int i = 0; i < 8; i++) {
int x = dx[i] + xx, y = dy[i] + yy;
if (x >= 1 && x <= n && y >= 1 && y <= n && (!st[x][y]) && a[x][y] == aim) {
if (i % 2 == 1 && vis[x][yy][xx][y]) continue;
st[x][y] = true;
vis[xx][yy][x][y] = vis[x][y][xx][yy] = true;
string sss = ss;
sss.push_back(char('0' + i));
dfs(kk + 1, sss, x, y, aim);
vis[xx][yy][x][y] = vis[x][y][xx][yy] = false;
st[x][y] = false;
}
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
if (a[1][1] != 0){
cout << -1;
return 0;
}
st[1][1] = true;
num = n * n;
dfs(1, s, 1, 1, 0);
if (s.empty()) cout << -1;
else cout << s;
return 0;
}
F不会,求助
【问题描述】
在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有
着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个与生俱来的特殊能力,可以发出不同强度的闪光。小蓝共找到了N 枚宝石,第 i 枚宝石的 “闪亮度” 属性值为 Hi ,小蓝将会从这 N 枚宝石中选出三枚进行组合,组合之后的精美程度 S 可以用以下公式来衡量:
其中 LCM 表示的是最小公倍数函数。
小蓝想要使得三枚宝石组合后的精美程度 S 尽可能的高,请你帮他找出精美程度最高的方案。如果存在多个方案 S 值相同,优先选择按照 H 值升序排列
后字典序最小的方案。
【输入格式】
第一行包含一个整数 N 表示宝石个数。
第二行包含 N 个整数表示 N 个宝石的 “闪亮度”。
【输出格式】
输出一行包含三个整数表示满足条件的三枚宝石的 “闪亮度”。
【样例输入】
5
1 2 3 4 9
【样例输出】
1 2 3
【评测用例规模与约定】
对于 30% 的评测用例:3 ≤ N ≤ 100,1 ≤ Hi ≤ 1000。
对于 60% 的评测用例:3 ≤ N ≤ 2000。
对于 100% 的评测用例:3 ≤ N ≤ 10^5 ,1 ≤ Hi ≤ 10^5 。
代码
// ???
G:爬山(?)
【问题描述】
小明这天在参加公司团建,团建项目是爬山。在 x 轴上从左到右一共有 n座山,第 i 座山的高度为 hi 。他们需要从左到右依次爬过所有的山,需要花费的体力值为 S = Σni=1 hi 。然而小明偷偷学了魔法,可以降低一些山的高度。他掌握两种魔法,第一种魔法可以将高度为 H 的山的高度变为 ⌊ H⌋,可以使用 P 次;第二种魔法可以将高度为 H 的山的高度变为 ⌊ H2 ⌋,可以使用 Q 次。并且对于每座山可以按任意顺序多次释放这两种魔法。小明想合理规划在哪些山使用魔法,使得爬山花费的体力值最少。请问最优情况下需要花费的体力值是多少?
【输入格式】
输入共两行。
第一行为三个整数 n,P,Q。
第二行为 n 个整数 h1 ,h2 ,. . . ,hn 。
【输出格式】
输出共一行,一个整数代表答案。
【样例输入】
4 1 1
4 5 6 49
【样例输出】
18
【样例说明】
将第四座山变为 ⌊ 49⌋ = 7,然后再将第四座山变为 ⌊ 72 ⌋ = 3。
体力值为 4 + 5 + 6 + 3 = 18。
【评测用例规模与约定】
对于 20% 的评测用例,保证 n ≤ 8,P = 0。
对 于 100% 的 评 测 用 例,保 证 n ≤ 100000,0 ≤ P ≤ n,0 ≤ Q ≤ n,0 ≤ hi ≤ 100000。
// 法一
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
// 但是!!!!!
// 根号49+48/2 = 7+24 = 31
// 49/2+根号48 = 24+6 = 30
// 所以这个代码如果数据强则不可以ac
using namespace std;
const int N = 1e5 + 10;
int n;
priority_queue<int> qq;
long long res = 0;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n, p, q;
cin >> n >> p >> q;
for (int i = 1; i <= n; i++){
int x;
cin >> x;
qq.push(x);
res += x;
}
while (qq.size()){
int t = qq.top();
qq.pop();
if (p) {
p--;
res -= t - sqrt(t);
qq.push(t);
} else if (q) {
q--;
res -= t - t / 2;
qq.push(t);
} else {
break;
}
}
cout << res;
return 0;
}
// 法二:请大家贡献一下自己的代码吧
// 法三:更新(不知道是不是对的)
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
typedef pair<int, int> PII;
struct cmp{
bool operator()(PII X, PII Y){
return X.second < Y.second || (X.second == Y.second && X.first > Y.first);
}
};
priority_queue<PII, vector<PII>, cmp> qq;
const int N = 1e3 + 10;
long long res = 0;
long long a[N];
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n, p, q;
cin >> n >> p >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
qq.push({a[i], a[i] - int(sqrt(a[i]))});
// cout << a[i] - int(sqrt(a[i])) << '\n';
}
while (p--) {
PII t = qq.top();
qq.pop();
int x = t.first;
int y = sqrt(x);
// cout << x << '\n';
qq.push({y, y - int(sqrt(y))});
}
// for (int i = 1; i <= n; i++) {
// cin >> a[i];
// qq.push({a[i], a[i] - a[i] / 2});
// }
while (q--) {
PII t = qq.top();
qq.pop();
int x = t.first;
int y = x / 2;
qq.push({y, y - y / 2});
}
while (qq.size()) {
PII t = qq.top();
qq.pop();
int x = t.first, y = t.second;
res += x;
}
cout << res;
return 0;
}
H:拔河(不会,求代码)
【问题描述】
小明是学校里的一名老师,他带的班级共有 n 名同学,第 i 名同学力量值
为 ai 。在闲暇之余,小明决定在班级里组织一场拔河比赛。
为了保证比赛的双方实力尽可能相近,需要在这 n 名同学中挑选出两个队
伍,队伍内的同学编号连续:{al1 , al1 +1 , …, ar1 −1 , ar1 } 和 {al2 , al2 +1 , …, ar2 −1 , ar2 },其
中 l1 ≤ r1 < l2 ≤ r2 。
两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可
能相近。请计算出力量值之和差距最小的挑选队伍的方式。
【输入格式】
输入共两行。
第一行为一个正整数 n。
第二行为 n 个正整数 ai 。
【输出格式】
输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。
【样例输入】
5
10 9 8 12 14
【样例输出】
1
【样例说明】
其中一种最优选择方式:
队伍 1:{a1 , a2 , a3 },队伍 2:{a4 , a5 },力量值和分别为 10 + 9 + 8 = 27,
12 + 14 = 26,差距为 |27 − 26| = 1。
【评测用例规模与约定】
对于 20% 的评测用例,保证 n ≤ 50。
对于 100% 的评测用例,保证 n ≤ 103 ,ai ≤ 109 。
代码
大佬带我AK
🙀🙀🙀