- 题解
【题解】西中经开联校 - 第 10 场周赛(csvoner不写ZKX写版)
- @ 2025-3-19 17:55:39
T1 时区转换
难度:特判
算法:似乎没有
Vvauted友情客串(
简单减法题,主要是对细节的注意
C++代码:
#include <bits/stdc++.h>
using namespace std;
string a; //开一个string
int hour , minute; //存小时和分钟
int main()
{
cin >> a; //string魅力时刻
hour = int(a[0] - '0') * 10 + int(a[1] - '0'); //计算小时
minute = int(a[3] - '0') * 10 + int(a[4] - '0'); //计算分钟
hour -= 15; //从csvoner到vvauted减 15 小时
if(hour < 0) hour += 24; //小时要是成负数就加一天变回正数
//注意:输出格式有要求
if(hour < 10) cout << 0; //当 hour < 10 时,输出为 0h 而不是 h;
cout << hour << ":"; //输出hour加冒号 “:”
if(minute < 10) cout << 0; //当 minute < 10 时,输出为 0m 而不是 m;
cout << minute; //输出mintue
return 0
}
T2 每数一位
难度:数学,找规律
算法:还是没有
数学题,用暴力会 TLE
拿纸笔推一推就会发现:
-
x9这个两位数的一位数位和一定 是x。例如 49 = 4 + 9 = 13 = 1 + 3 = 4 -
(9n - x)的一位数位和一定相等 (减运算时间的大头)
例如 16 = 18 - 2 , 25 = 27 - 2
1 + 6 = 7
2 + 5 = 7
然后就是代码实现
C++代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n; //开 n (看数据范围 10^12 要开 long long)
cin >> n; //输入n
long long tot = 0; //结果变量
tot += 45 * (n / 9); //算出有多少个 (9n) ~ (9n + 8)被循环掉,每次加上45(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9)
n %= 9; //把刚刚加过的模掉
if(n != 0) //要是没模干净
{
while(n) //只要n != 0
{
tot += n; //tot 加上 n (因为被9模了所以一定是个位数)
n --; //n向下遍历
}
cout << tot; //输出答案
return 0;
}
else cout << tot; //n = 0 的话就说明在22行已经作为循环被加光了,直接输出即可
return 0;
}
T3 数串质数
难度:判定质数,存大数字
算法:问号
简单的遍历
数据范围超小
只要会 判定质数 和 存大数字
这道题就可以秒掉
所以直接暴力
C++代码:
#include <bits/stdc++.h>
using namespace std;
bool is_prime(int n) //试除法判定指数
{
if (n < 2) return false; //小于 2 的一律不是
for (int i = 2; i < n; i ++ ) //从2开始除
if (n % i == 0) //如果能被整除
return false; //不是质数,返回false
return true; //在上面的循环里没有被整除,是质数,返回true
}
int a[1000010]; //开一个数组拿来存10 ~ n的超长数字
int main()
{
int n; //开 n
cin >> n; //输入
int j = 0; //j作为下标变量,约等于指针
for(int i = 10 ; i <= n ; i ++) //i从10 ~ n开遍
{
a[j] = i / 10; //把 i 的十位存在 a 的 第 j 项里
a[j + 1] = i % 10; //把 i 的个位存在 a 的 第 j + 1 项里
j += 2; //j 往后跳两格
}
int len = 2 * (n - 10 + 1); //计算长度
int cnt = 0; //计数变量存质数个数
for(int i = 0 ; i < len - 3 ; i ++)//又是遍历,i从0 ~ (len - 3) (四位数要留三个位置)
{
if(a[i] == 0) continue; //当位是0就跳过(构不成四位数)
int num = a[i] * 1000 + a[i + 1] * 100 + a[i + 2] * 10 + a[i + 3];//num存四位数
//计算方法:a[i] 做千位,a[i + 1]做百位,a[i + 2]做十位,a[i + 3]做个位
if(is_prime(num)) cnt ++; //num要是质数就计数变量cnt + 1
}
cout << cnt; //输出质数个数
return 0;
}
T4 四数转盘
难度:找到左转和右转的本质
算法:模拟
最好玩的题
还是找规律
拿一个指针指向要输出的字母位置
左转就向右移一位
例如
左转前:
↓
AB
DC
也可以看做作:
↓
ABCD
左转后:
↓
BC
AD
也可以看作:
↓
BCDA
or
↓
ABCD
右转就向左移一位
例如
右转前:
↓
AB
DC
也可以看做作:
↓
ABCD
右转后:
↓
DA
CB
也可以看作:
↓
DABC
or
↓
ABCD
这下就简单了
C++代码:
#include <bits/stdc++.h>
using namespace std;
string spin; //存旋转方式
string out; //存是否输出
char a[4] = {'A' , 'B' , 'C' , 'D'}; //先开一个ABCD
int main()
{
cin >> spin >> out; //输入 旋转方式 和 输出时机
int len = spin.size(); //用size求长度
int way = 0; //要输出的字母的下标
for(int i = 0 ; i < len ; i ++) //遍历旋转方式
{
if(spin[i] == 'L') //要是左转
{
way ++; //下标右移
if(way > 3) way -= 4; //出界了就拉回来
}
else if(spin[i] == 'R') //要是右转
{
way -= 1; //下标左移
if(way < 0) way += 4; //出界了就拉回来
}
if(out[i] == 'o') cout << a[way]; //要是要输出就把当前 way 指向的字母输出即可
}
return 0;
}
0 comments
No comments so far...