小题做做,大题开摆🤗🤗🤗,四舍五路,我就是在前进的路上捏🤗
🤗题目
A、跑步训练(5分)

我就怕这种细节题,一不小心就寄寄辣,还是写稳点好
#include<iostream>
using namespace std;
int main()
{
int health = 10000;
int run = 600;
int rest = 300;
int res = 0;
while(health >= run)
{
health -= run;
res += 60;
health += rest;
res += 60;
}
if(health) res += health / (run / 60);
cout<<res<<endl;
return 0;
}
// 3880
B、纪念日(5分)

我害怕爆int,所以猥琐点,用long long,结果没报🤡哈哈
#include<iostream>
using namespace std;
typedef long long LL;
int months[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool flag1,flag2; // 为了让第一次从7月23日开始
int main()
{
LL res = 0;
for(int year = 1921 ; year <= 2020 ; year++)
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
months[2] = 28 + leap;
for(int month = 1 ; month <= 12 ; month++)
{
if(!flag1)
{
month = 7;
flag1 = true;
}
for(int day = 1 ; day <= months[month] ; day++)
{
if(!flag2)
{
day = 24;
res += 12 * 60;
flag2 = true;
}
if(year == 2020 && month == 7 && day == 1)
{
res += 12 * 60;
cout<<res<<endl;
return 0;
}
res += 24 * 60;
}
}
}
return 0;
}
// 52038720
C、合并检测(10分)

我们枚举k,我觉得是10
#include<iostream>
using namespace std;
int main()
{
int perCnt = 100; // 假设有100个人检测,那边就有1人是感染者
int ans = 99999; // 设一个最大值
for(int k = 1 ; k <= 100 ; k++)
{
int t = perCnt / k + k;
ans = min(ans,t);
}
cout<<ans<<endl;
return 0;
}
D、REPEAT程序(10分)

这真不怪我,题都无了
E、矩阵(15分)

F、整除序列(15分)

#include<iostream>
using namespace std;
long long n;
int main()
{
cin >> n;
while(n)
{
cout<< n <<' ';
n /= 2;
}
return 0;
}
G、解码(20分)

【数据范围】
输入字符串由大小写英文字母和数字组成,长度不超过 100100。
请注意原来的串长度可能超过 100100。
【输入样例】
H3el5o2
【输出样例】
HHHellllloo
我们在这里整一串,新的字符串
#include <iostream>
using namespace std;
int main()
{
string s,str;
cin>>s;
for(int i = 0 ; i < s.size() ; i++)
if(i + 1 < s.size() && s[i + 1] <= '9' && s[i + 1] >= '1')
{
int k = s[i + 1] - '0';
while(k--)
str += s[i];
i++;
}
else
str += s[i];
cout<<str<<endl;
return 0;
}
H、走方格(20分)

小小DP一题,轻松拿下

#include<iostream>
using namespace std;
int n,m;
const int N = 40;
int f[N][N];
int main()
{
cin>>n>>m;
f[1][1] = 1;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
{
if(i == 1 && j == 1) continue;
if(i % 2 || j % 2)
f[i][j] = f[i-1][j] + f[i][j-1];
}
cout<<f[n][m]<<endl;
return 0;
}
I、整数拼接 (25分)

J、网络分析(25分)
小明正在做一个网络实验。
他设置了 n 台电脑,称为节点,用于收发和存储数据。
初始时,所有节点都是独立的,不存在任何连接。
小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。
两个节点如果存在网线连接,称为相邻。
小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转=发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。
所有发送和接收的节点都会将信息存储下来。
一条信息只存储一次。
给出小明连接和测试的过程,请计算出每个节点存储信息的大小。
【输入格式】
输入的第一行包含两个整数 n,m 分别表示节点数量和操作数量。
节点从 1 至 n 编号。
接下来 m 行,每行三个整数,表示一个操作。
- 如果操作为
1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。 - 如果操作为
2 p t,表示在节点 p 上发送一条大小为 t 的信息。
【输出格式】
输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。
【数据范围】
1≤n≤10000,
1≤m≤
1
0
5
10^5
105,
1≤t≤100
【输入样例1:】
4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1
【输出样例1:】
13 13 5 3
这个考察并查集,开摆,附y总代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
int n, m;
int p[N], d[N];
int find(int x)
{
if (p[x] == x || p[p[x]] == p[x]) return p[x];
int r = find(p[x]);
d[x] += d[p[x]];
p[x] = r;
return r;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) p[i] = i;
while (m -- )
{
int t, a, b;
scanf("%d%d%d", &t, &a, &b);
if (t == 1)
{
a = find(a), b = find(b);
if (a != b)
{
d[a] -= d[b];
p[a] = b;
}
}
else
{
a = find(a);
d[a] += b;
}
}
for (int i = 1; i <= n; i ++ )
if (i == find(i)) printf("%d ", d[i]);
else printf("%d ", d[i] + d[find(i)]);
puts("");
return 0;
}
每日练习3题
0 和1 不是质数嗷,来一个埃氏筛n(longn)
#include<iostream>
using namespace std;
const int N = 20210605 + 10;
int primes[N],cnt;
bool st[N];
int n = 20210605;
bool check(int x)
{
int t = x;
while(t)
{
if(st[t % 10])
return false;
t /= 10;
}
return true;
}
void get_primes(int n)
{
for(int i = 2 ; i <= n ; i++)
{
if(!st[i])
{
if(check(i)) primes[cnt ++] = i;
for(int j = i + i ; j <= n ; j += i) st[j] = true;
}
}
}
int main()
{
st[0] = st[1] = true; // 0 和 1 不是质数
get_primes(n);
cout<<cnt<<endl;
return 0;
}
没搞明白
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int i, k;
cin >> k;
for (i = 1; ; i++)
{
if (k == 1)
{
cout << i;
return 0;
}
int t = (pow(3, i) - 1) / 2;
int r = (pow(3, i + 1) - 1) / 2;
if (t < k && r >= k )
break;
}
cout << i + 1;
return 0;
}
这是我第二次被曼哈顿距离薄纱,我还搁那研究双端队列广搜呢
#include<iostream>
using namespace std;
const int N = 100 + 10;
int n, m, t, r[N], c[N];
int main()
{
cin >> n >> m >> t;
for(int i = 1;i <= t;i ++)
cin >> r[i] >> c[i];
int k;
cin >> k;
int cnt = 0;
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= m;j ++)
{
for(int l = 1; l <= t; l ++)
{
int d = abs(r[l] - i) + abs(c[l] - j);
if(d <= k)
{
cnt ++;
break;
}
}
}
}
cout << cnt << endl;
}
真不如开摆有意思,开摆立即上天堂😇
本文分享了多个编程挑战的解决方案,包括跑步训练的最短时间计算、纪念日的日期统计、合并检测的最小检测次数等。涉及动态规划、字符串处理和并查集等算法,同时展示了对质数筛选、最小砝码选择和灌溉问题的思考。通过这些实例,展示了作者在算法和编程实践上的技巧和理解。
2522

被折叠的 条评论
为什么被折叠?



