上海市计算机学会竞赛月赛2025年2月份丙组

T1电话号码

【题目链接】

原题链接:上海市计算机学会竞赛平台 | YACS

【考点】

数位拆解、判断

【题目大意】

电话号码是由 5 位无前导 0 的数字组成的,长度不等于5与有前导0的都是无效电话号码。Alice 每天都存下 x 元钱,坚持了 n 天,问她存下的总钱数是不是一个有效的 A 国电话号码?

【解析】

使用c++格式化输入得到每天存钱x以及坚持天数n,计算得到总金额sum,对sum开始数位拆解得到号码长度,判断其号码长度是否等于5。

【难度】

GESP二级

【代码参考】

#include
using namespace std;

int main(){
	int t, n, x;
	cin >> t;
	while(t--){
		cin >> n >> x;
		int sum = n * x, len = 0;
		while(sum){
			len++;
			sum /= 10;
		}
		if(len == 5)cout << "YES" << endl;
		else cout << "NO" << endl; 
	}
	return 0;
}

T2 新二进制

【题目链接】

原题链接:上海市计算机学会竞赛平台 | YACS

【考点】

权重、二进制

【题目大意】

新的二进制只有1或-1,它可以表示为 b1×2^0+b2×2^1+⋯+bn×2^(n-1),与二进制转十进制公式相同,在有些区间[l,r]计算结果>0也可能<0,求一串新二进制数区间计算结果为正数的个数-为负数的个数的绝对值。

【解析】

该题目可以抽象为判断第i位的正负,因为[i,i]的计算的结果一定大于[1,i-1]的结果,从而可以使用排列组合的思维得到区间[1,i]的正/负个数。例如[i,i]计算结果为正数,那么[1,i]一定有i个正数,负数同理。通过遍历输入数组里的内容,判断第i位的正负,累加i在a或b变量里,最后输出abs(a-b)。

【难度】

GESP四级

【代码参考】

#include
using namespace std;

int main(){
	long long t, n, a, b, m[100005];
	cin >> t;
	while(t--){
		cin >> n;
		a = 0, b = 0;
		memset(m, 0, sizeof(m));
		for(int i = 1; i <= n; i++)cin >> m[i];
		for(int i =

你可能感兴趣的:(青少年编程比赛题解,c++,算法,上海市计算机学会竞赛平台)