飞翔杯 Round #3 基础组全题解!
2025-06-15 19:09:27
发布于:广东
求置顶谢谢
如果正在看题解的你是一个帅帅的大男孩或者美美的大女孩或者老师就给我点一个赞,谢谢。
T1:求和
题目链接
个人难度:红 中
题目大意:
给你一个长度为 的数组 ,满足 。求出所有以0
或者5
结尾的 的总和。
题目分析:
打表发现满足条件的数依次是5,10,15,20,25......
不难发现这些数字的共同特点为都是5
的倍数,即取余5
等于0
。
所以满足条件的数累加即可。
易错点:
最大的满足条件的数是 ,而 最大是 ,那么最大的结果就是 ,会超过 int
的范围,所以需要使用 long long
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
long long sum = 0,x;//long long 保存结果
for(int i = 1;i<=n;++i){
cin>>x;
if(x%5 == 0) sum+=x;//满足条件则累加
}
cout<<sum;
}
时间复杂度:
T2 字符串价值
题目链接
个人难度:红 上
题目大意:
给定字符串 ,每个字母的价值是这个字母在 中出现的次数 这个字母的 值。
代码实现:
别问为什么没有分析,因为99%的人做法都一样
#include<bits/stdc++.h>
using namespace std;
int mp[60];
int main(){
string s;
cin>>s;
for(auto i:s){
if(i>='a'&&i<='z'){
mp[int(i-97)]++;
}else{
mp[int(i-65+26)]++;
}
}
long long sum = 0;
for(int i = 0;i<=52;++i){
if(i<=25){
sum+=mp[i]*(i+97);
}else sum+=mp[i]*(i-26+65);
}
cout<<sum;
}
时间复杂度:
T3 数位和
题目链接
个人难度:橙 下 实际难度:红 上
题目大意:
给定两个日期 ,日期 是 ,日期 是 。 计算从日期 到日期 所经过的每一个日期有几种不同的数位和。
如 的数位和是 , 的数位和是 ,他们就是相同的数位和。
题目分析:
其实这题真的没有什么好说的,你们自己看吧。
易错点:
1.2月29日的判断
2.别漏掉最后一天
代码实现:
可能会有点乱,见谅。
#include<bits/stdc++.h>
using namespace std;
int mp[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
bool runnian(int x){//判断闰年
if((x%4 == 0&&x%100!=0)||x%400 == 0) return 1;
return 0;
}
int s[100];//映射不同的数位和
int he(int y,int m,int d){//数位和
int sum = 0;
while(y!=0){
sum+=y%10;
y/=10;
}
while(m!=0){
sum+=m%10;
m/=10;
}
while(d!=0){
sum+=d%10;
d/=10;
}
return sum;
}
int main(){
int y,m,d,y2,m2,d2;
cin>>y>>m>>d>>y2>>m2>>d2;
s[he(y2,m2,d2)]++;
if(runnian(y)&&m == 2&&d == 29){
int ss = he(y,m,d);
if(s[ss] == 0) s[ss] = 1;
m = 3;d = 1;
}
while(!(y == y2&&m == m2&&d == d2)){
int ss = he(y,m,d);
if(s[ss] == 0) s[ss] = 1;
if(runnian(y)&&m == 2&&d == 28){
int ss = he(y,m,d+1);
if(s[ss] == 0) s[ss] = 1;
}
if(d == mp[m]){
if(m == 12&&d == 31){
y++;
m = 1;
d = 1;
}
else{
m++;
if(m == 13) m=1;
}
d=1;
}else ++d;
}
int ans = 0;
for(int i = 0;i<=99;++i){//结果计算
if(s[i] == 1) ans++;
}
cout<<ans;
}
时间复杂度:反正不超时就对了OvO
T4 减少荒地开垦
题目链接
前话:
看着好熟悉,疑似2025 GESP 三月份 四级编程题真题
个人难度 橙 中
题目大意
给定 的网格土地,定义一块土地可以开垦当且仅当这块土地自身以及上下左右都没有杂物。杂物用#
表示,空地用.
表示。
可以在一个地方放上杂物,求最后最少的可以开垦的土地数量。
题目分析:
开个 数组, 代表 可以开垦, 代表 有杂物, 代表 虽然没有杂物但是也不能开垦。
然后依次遍历每一个地方,计算在这里放一个杂物可以可以减少几个能开垦的地方。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int vis[1009][1009];
char a[1009][1009];
int n,m;
bool check(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=m);
}
int main(){
cin>>n>>m;
for(int i = 1;i<=n;++i){
for(int j = 1;j<=m;++j){
cin>>a[i][j];
if(a[i][j] == '#') vis[i][j] = 1;
}
}
for(int i = 1;i<=n;++i){
for(int j = 1;j<=m;++j){
if(vis[i][j] == 1){
if(vis[i][j-1]!=1) vis[i][j-1] = 2;
if(vis[i][j+1]!=1) vis[i][j+1] = 2;
if(vis[i-1][j]!=1) vis[i-1][j] = 2;
if(vis[i+1][j]!=1) vis[i+1][j] = 2;
}
}
}
int sum = 0;
for(int i = 1;i<=n;++i){
for(int j = 1;j<=m;++j){
if(vis[i][j] == 0) sum++;
}
}
int ans = 12345678;
for(int i = 1;i<=n;++i){
for(int j = 1;j<=m;++j){
int f = 0;
if(vis[i][j] == 0&&check(i,j)) ++f;
if(vis[i][j-1] == 0&&check(i,j-1)) ++f;
if(vis[i][j+1] == 0&&check(i,j+1)) ++f;
if(vis[i-1][j] == 0&&check(i-1,j)) ++f;
if(vis[i+1][j] == 0&&check(i+1,j)) ++f;
ans = min(ans,sum-f);
}
}
cout<<ans;
}
时间复杂度:
赞赞,谢谢。
全部评论 5
顶 置顶 赞
2025-06-15 来自 广东
1%%%(我知道你要说什么)
2025-06-15 来自 广东
0我就不说
2025-06-15 来自 广东
0nzdwyssmnmn
2025-06-15 来自 广东
0
d
2025-06-15 来自 浙江
0%%%
2025-06-15 来自 北京
0d
2025-06-15 来自 江苏
0
有帮助,赞一个