• 题解
  • 【题解】西中经开联校 - 第 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...