前言
“现在我不在意的小事,会在未来要了我的命。”
从2022/11/6开始,在csdn记录每日做过的题目的思路与反思;
提示:以下是本篇文章正文内容,下面案例可供参考
问题 A: 法斯特异或
题目描述
给定l,r(l<=r),求l xor l+1 xor l+2 xor l+3 xor ,,, r
输入
输入只有一行,包含两个正整数l(0<l<=1e18), r(0<r<=1e18)
输出
输出答案
样例输入 Copy
1 4
样例输出 Copy
4
看到这个题就知道是要求异或和
但数据范围到了1e18,暴力会超时,所以需要找规律,直接稿纸上列下情况就可以发现规律。我发现的规律比官方题解要低级,是偶数n^(n+1)= 1;然后就计算l-r中有多少个这样的n^(n+1)
#include <iostream> using namespace std; int main(){ long long l , r; cin >> l >> r; long long res = 0; if((r-l)/2 > 0) { if((r-l)/2 & 1) res = 0; else res = 1; if(r % 2 == 0) res ^= r; } else for(int i = l ;i <= r;i++){ res ^= i; } cout << res; return 0; }
刚看到题目,没去看数据范围,直接条件反射暴力超时。
下面是官方题解
可以通过打表找规律发现,从0开始异或到n
如果n%4 == 0,结果是n n%4 == 1,结果是1 n%4 == 2,结果是n+1 n%4 == 3,结果是0
题目问的是从l异或到r, 可以分别求出从0异或到l-1,从0异或到r的结果,然后再异或起来 及a xor a = 0, (a xor (a xor b)) = b,(复习的时候发现看不懂,再做些补充:此处a是0~l-1,b是0~r,a异或b的式子里,有两份0~l-1,把他们单独拿出来看,就是a^a -> 0
long long judge(long long x) { int y = x%4; if (!y) return x; if (y==1) return 1; if (y==2) return x+1; return 0; } int main() { long long l, r; scanf("%lld %lld", &l, &r); printf("%lld\n", judge(l-1)^judge(r)); return 0; }
问题 C: 寻宝猎人
时间限制: 1 Sec 内存限制: 128 MB
提交: 736 解决: 347
题目描述
寻宝猎人Tom发现了一处宝藏,宝藏为一个N * M 的矩阵组成,矩阵的每一个点都包含一个钱袋,钱袋中装有若干金币。现在Tom只想从这个矩阵中拿走一块 3 * 3 的矩阵,请问他能拿走的最大金币数量。
输入
第一行输入两个整数N和M,表示矩阵的长和宽。
接下来N行,每行M个整数,表示钱袋中金币的数量。
3<= N , M <= 200
0<= 钱袋中金币数量 <= 1000
输出
输出一个数字,表示Tom能拿走的最大金币数量。
样例输入 Copy
5 4
0 1 1 5
2 0 9 1
3 1 1 4
1 2 3 4
4 3 1 1
样例输出 Copy
25
纯水题,双循环i,j暴力求当前区域金币数量后与循环外定义的res变量比较。据题意写i,j范围,要据题意res初始化的值,此题的数值均>= 0,可以初始化res为0,部分题目有负值的可以将res初始化为-1e9之类的比数据范围最小值更小的值
#include <iostream> using namespace std; int main(){ int n,m; cin >> n >> m; int a[210][210]; for(int i = 0;i < n;i++){ for(int j = 0; j < m ;j++){ cin >> a[i][j]; } } int res = -999,num; for(int i = 0;i < n-2;i++){ for(int j = 0;j < m-2;j++){ num = a[i][j]+a[i+1][j]+a[i+2][j]+a[i][j+1]+a[i][j+2]+a[i+1][j+1]+a[i+1][j+2]+a[i+2][j+1]+a[i+2][j+2]; if(num > res) res = num; } } cout << res; return 0; }
问题 D: 代码格式化
时间限制: 1 Sec 内存限制: 128 MB
提交: 931 解决: 442
题目描述
Madoka最近在开发一款名叫《魔法少女まどか☆マギカ》的游戏。令人苦恼的是,组里的Homura,Sayaka很个性,一个喜欢驼峰命名法,一个喜欢下划线命名法,现在只好拜托你开发一个程序,把所有的下划线命名的变量改为驼峰命名。
输入
第一行一个正整数n(n<=1e3)
后面n行,每行一串字符串,保证如下条件
1.字符串只有字母,数字和下划线组成
2.字符串的第一个字符必定是字母
3.不会有两个及以上的下划线连续出现
4.字符串长度不超过100
输出
输出每行,每行为转换后的字符
样例输入 Copy
4
a_b_c
a_1_c
Add_ads_dd
a
样例输出 Copy
A_B_C
A_1_C
Add_Ads_Dd
A
注意点:
复习补充:(模拟题,在草稿纸上列好要点,再用样例和自己写的样例验证)
1、开头字母大小写转换
2、下划线后判断是否为小写字母,是则转换
这题也是没有好好读题干,调试了6、7遍才过,考虑的情况太少了
没注意开头字母判断和下划线后是数字的情况,还好用例给的情况全面,否则此题必wa
#include <iostream> using namespace std; int main(){ string n; int t; cin >> t; while(t--){ cin >> n; for(int i = 0;n[i];i++){ if(n[i] == '_' && n[i+1] >= 'a' && n[i+1] <= 'z') n[i+1] -= 'a' - 'A'; if(i == 0 && n[i] >= 'a' && n[i] <= 'z') n[i] -= 'a' - 'A'; } cout << n << endl; } return 0; }
问题 G: 安全出行(思维,模拟)
时间限制: 1 Sec 内存限制: 128 MB
提交: 630 解决: 196
题目描述
有 N 辆汽车在无限长的单行道上行驶,且行驶方向为坐标值增大的方向。每辆车在跑道上开始行驶的位置互不相同,一些车辆的行驶速度可能相同,也可能不同。由于跑道是单行道,十分狭窄,汽车们无法相互超越。当一辆速度很快的汽车追上另一辆汽车时,他必须减速至与另一辆车速度相同以免发生碰撞,并成为同一车队的一员。此时,两辆车可以视为在同一点上。最终,再也没有汽车会撞到(追上)其他汽车了。
求在这种情况下,会剩下多少个车队。
输入
第一行包含整数N。
接下来N行,每行包含一辆车的初始位置和行驶速度。
所有车辆的初始位置各不相同,且是按照递增顺序给出的。
1<= N <= 1e5
初始位置范围[0 , 1e9]
行驶速度范围[0 , 1e9]
输出
输出一个整数,表示最终剩下的车队数量。
样例输入 Copy
5
0 1
1 2
2 3
3 2
6 1
样例输出 Copy
2
#include <iostream> using namespace std; struct car{ int pst,v; }a[190000]; int main(){ int n; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i].pst >> a[i].v; } int num = 0,vv = a[n-1].v; for(int i = n-1;i >= 0;i--){ if(a[i].v <= vv){ vv = a[i].v; num++; } } cout << num; return 0; }
车的位置是从小到大的,所以车的位置可以不用看,(比赛时没想到这点,甚至条件反射写了个bool准备sort结构体数组(常用套路))(但是能归入套路的话可以节省思考时间)
直接用数组存车速,前边的车决定了车速上限,所以反向遍历,比较车速,后车车速<= 速度上限,则车队加一,同时更新速度上限。
卡了一小时的题,re七发 ,ce1发
1e5错当10000,老毛病了
问题 H: 统计数字
时间限制: 1 Sec 内存限制: 128 MB
提交: 1525 解决: 839
题目描述
输入N个数,分别统计其中负数的个数、0的个数、正数的个数。
输入
第一行输入整数N。
接下来输入N个整数。
1 <= N <= 10000
输出
输出三行,每行一个整数。第一行为负数的个数,第二行为0的个数,第三行为正数的个数。
样例输入 Copy
5
8 9 -1 0 0
样例输出 Copy
1
2
2
存、遍历、判断and计数、输出
格式错误1发,想当然的以为三个输出数据之间用空格隔开就好,交之前没好好看输出格式
总结
做的好的地方:
1、A题没思路的时候通过从头到尾将题面看三遍的方法获得了思路
做的不好的地方:
1、跟榜做题顺序错误
2、题面、样例和编译选项不仔细看,tle一发,格式错误一发,ce一发;
3、卡题时没有及时转换战场,浪费了很多时间
4、情况考虑不充分
反思:
1、声明变量类型前至少要把数据的范围看一遍,交题前至少把样例输出格式看一遍。
2、跟榜时好好确认通过人数和通过率,同时不能无脑跟榜,想好题目思路确认可以实现再开敲代
码;
3、写题前列出题目要求与注意点
4、交题前尝试hack自己代码,否则若错误被罚时得不偿失