- 博客(38)
- 收藏
- 关注
原创 PTA——寻宝路线
题目描述在一个m行n列方格矩阵中,每一个方格内摆放着价值不等的宝贝(价值可正可负),让小明感到好奇的是,从左上角到达右下角的所有可能路线中,能捡到宝贝的价值总和最大是多少?而且这种达到最大值的路线又有多少条?【注意:只能从一个格子向下或向右走到相邻格子,并且走到的格子宝贝一定会被捡起。】输入格式:第一行为整数m,n(均不大于100),下一行开始会有一个m行n列的整数方阵,对应方格矩阵中的宝贝价值(这些值的绝对值都不超过500)。输出格式:单独一行输出2个整数,分别为能捡到宝贝价值总和的最大值和达
2022-05-11 17:08:19 1126
原创 最长公共子序列(经典dp题)
题目可以看力扣上的这个:https://leetcode.cn/problems/qJnOS7/dp求最长子序列的问题,过长的字符串处理不了,因为dp过程中要用到二维数组,二维数组定义不能过大。下面代码我做了扩展,增加了输出最长子序列字符串的部分。总得来说目前看到的输出所求字符串的做法有两种:一:遍历过程中直接用string的二维数组记录。二:回溯法:先遍历求出长度,过程中记录获得数值的路径。后续再遍历路径数组求出最长子序列。法一代码//求最长公共子序列,遍历过程中记录公共字符串#includ
2022-05-10 17:46:03 312
原创 贪心 —— 会场安排问题总结
题目:申请会场问题有n个活动申请使用会场,每个会场只按整点时段接待活动,同时每个会场任意时段内最多接待一个活动。比如某个活动起始时间是2点,结束时间是4点,则意味着该活动从2点00分到4点59分都要占用会场。如果要把n场活动全部举行,最少需要几个会场。输入格式:第一行输入活动的个数n,n<100。第二行依次输入n场活动的起始时间(整数)。第三行依次输入n场活动的结束时间(整数)。输出格式:输出最少需要的会场个数。输入样例:在这里给出一组输入。例如:32 3 04 5 2输出样例
2022-05-06 13:38:45 1871
原创 Codeforces Round #780 (Div. 3) A-D
A. Vasya and Coins解题思路: 整个分为两种情况1:一个1-burle也没有,此时得不到1(2-burle不能拆开) 因此答案为1。2:有1-burle存在,此时最多可以得到1-burle+22-burle,因此答案为1-burle+2burle+1。对于2,当要凑奇数(1,3,5……)时,拿一个1-burle,其他用2-burle凑即可,因此1-2*2-burle的数都能凑出来,后面就用完1-burle凑出最大的数,再加1即为结果。#include<iostream>
2022-04-02 16:16:53 550 2
转载 二分搜索手动实现
附上参考的大佬的文章链接https://baobaobear.github.io/post/20210507-binsearch/看了大佬写的二分搜索杂谈,感觉瞬间就顿悟了,大佬真的写的非常非常清楚!orz (原来一直对二分里循环,判断时的等于要不要加,l=mid/l=mid+1,r=mid/r=mid-1分的不是很清楚,写的时候也觉得挺混乱的) 然后在此参考大佬文章总结了一部分,做个笔记。一: 二分搜索找值1:递归写法int binary_search(const int arr[], int s
2022-03-31 00:29:53 114
原创 2n皇后问题
解题思路: 没有写过n皇后问题的话直接看这个会不太理解。建议先弄清n皇后问题在看这个。在黑皇后搜索的状态下,加入对白皇后状态的搜索。和原本n皇后的区别在于,当对黑皇后搜索到满足状态时不是直接计数,而是转为对白皇后进行状态搜索。#include<iostream>#include<cmath>using namespace std;int map[10][10], n, ans = 0;int bookblack[10], bookwhite[10];//用来标记第i行的皇后
2022-03-27 17:43:41 437
原创 牛客月赛46 A-C
A解题思路: 如总比赛次数为3,Alice获胜一局的概率为C(1,3)(即三个里面选1个) * 1/2* 1/2*1/2。因为两者获胜概率都为1/2,则后面一直都是乘n(游戏局数)个1/2,因此只需要找到前面组合数最大的位置即可。#include<iostream>using namespace std;int main(){ int n; cin >> n; if (n % 2 == 0) cout << n / 2 << endl;
2022-03-26 15:53:28 3879
原创 Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round) C. Alice and the Cake
题目链接: https://codeforces.com/contest/1654/problem/C参考大佬题解链接附上 https://www.acwing.com/solution/content/102783/解题思路: 对序列求和,从和开始切分模拟。当切分出的数字在序列中存在时删除序列中的数。不存在时对此数字进行切分。巧妙处如下:1: 用multiset记录序列,提升删除,查找性能,且multiset没有去重效果。2: 对模拟切分操作进行分析,经过每一次切分操作后数字会多一个,当切分n-1
2022-03-24 19:45:16 629
原创 Educational Codeforces Round 125 (Rated for Div. 2) A-D
有参考大佬题解,附上链接https://blog.csdn.net/yanweiqi1754989931/article/details/123682475A解题思路: 别被题目案例误导,总共只有三种情况1: x == 0 && y == 0 在原点,不用移动,步数为0。2: 当sqrt(xx+yy)为整数时,满足题目条件。走欧拉距离,步数为1。3: 当sqrt(xx+yy)不为整数,走曼哈顿距离,取路线为(0,0)-(x1,0)-(x1,y1)。即一定可以通过0/1/2步且满足题
2022-03-23 17:32:49 1094
原创 Codeforces Round #661 (Div. 3) C. Boats Competition
题目链接: https://codeforces.com/problemset/problem/1399/C题目要求: 要求找出每艘船总重一定时,能凑出的船数最大值(当两人重量之和正好为船总重时才能乘一艘船)。解题思路: 看题目数据,n很小,直接暴力即可。一: 根据题目要求,要两个人坐一艘船,又每人体重范围为1~n。则船总重量范围为2 ~2*n。对船的总重进行遍历。二: 思考可知,必然是体重平均(如最重的和最轻的坐一艘船)的情况能凑成的船数最多。因此对重量排序后采用类似双指针的方法从前后往中间遍历。
2022-03-22 17:19:17 274
原创 Codeforces Round #640 (Div. 4) B. Same Parity Summands
题目链接: https://codeforces.com/problemset/problem/1352/B解题思路: 模拟,题目要求只能用k个奇数或者偶数组成和为n的序列。因此对两种情况分别模拟即可。一: 前k-1个数全用1填充,若n-(k-1)也为奇数(注意n-(k-1)<0的情况),则说明此种情况全用奇数填充可行。输出序列即可。二: 前k-1个数全用2填充,若n-2*(k-1)也为偶数(注意n-2*(k-1)<0的情况),则说明此种情况全用偶数填充可行。输出序列即可。三: 若前两种
2022-03-20 17:29:43 269
原创 Codeforces Round #719 (Div. 3) D. Same Differences
题目链接:https://codeforces.com/problemset/problem/1520/D解题思路: 题目要求j-i=aj-ai,变形可得aj-j=ai-i。即意为差值相同即可。由于map只会计入一次相同元素,此处用map计数不能更合适了。对每个输入的元素,用map[ai-i]记录差值相等元素的个数。对每一个存在差值相同元素的ai来说,它能组合前面的任意一个元素。则ai的组合对数即为m[ai-i],计算完ai的组合对数后需对map进行更新,将ai计入进去。因此用ans+=m[ai-i]+
2022-03-20 10:55:38 131
原创 Codeforces Round #271 (Div. 2) B. Worms
题目链接: https://codeforces.com/problemset/problem/474/B#include<iostream>#include<vector>#include<algorithm>using namespace std;typedef long long ll;int n;int main(){ int m, a; cin >> n; vector<ll> boundary(n + 1); b
2022-03-15 23:13:00 107
原创 Codeforces Round #191 (Div. 2) A. Flipping Game
题目链接: https://codeforces.com/problemset/problem/327/A解题思路: 只能说大佬的思路真的很是巧妙一: 用ans求和后的正负表示当前区间是否可取二: 当ans<0说明该区间1比0多,取后得不偿失,因此不取,重置ans=0。三: 用max记录了最大的区间反转值(因为max由ans而来,存在区间中连续的0和1抵消少计的情况)四: 用count记录数字序列所有1的数量(因存在上述问题,因为01反转后求和结果仍为1,我们对1计数最后加入结果即可避免此问
2022-03-15 18:50:56 351
原创 2^k进制数
题目链接 https://www.dotcpp.com/oj/problem1110.html解题思路: 看了一个大佬的题解,有被震惊到,思路就是反向解题——做减法。对于本题来说,最特殊的就是可能不会取满的首位,如题目案例中最高的百位只能取1。如3 8这个例子中最高的百位也只能在1-3中取到。1: 对于百位的处理(以3 8为例),我们可以选择正向处理,即先取百位(1/2/3)再在按条件取其他位的数字。(需要考虑比如最最高位取2后其他数字不能再取1等情况)计算较麻烦。2: 也可以先计算1-7中任取三个
2022-03-14 16:33:02 1196
原创 Codeforces Round #777 (Div. 2)A-C
A解题思路:1:12:23:214:1215:2126:21217:121218:212129:212121n:………………规律:只能用1,2组成数字n,一组1,2组成数字3。因此计算数字n对3求余。一: 当n%3=0,说明组成n的1和2的数量相等。从2开始才能得到最大值。二: 当n%3=1,说明组成n的数字1的数量>2。为了避免相同数字在一起,只能从1开始。三: 当n%2=2,说明组成n的数字2的数量>1。为了避免相同数字在一起,只能从2开始。#include&
2022-03-13 14:41:14 368
原创 Educational Codeforces Round 124 (Rated for Div. 2) -B-C
原题链接https://codeforces.com/contest/1651/problem/B解题思路: 读题,题目要求对于任意的i,j做了ai=aj=|ai-aj|操作后都不会减小。一: 满足不会减小这个条件。有a+b>=2*(a-b)(假设a是大的数) 则解方程有a>=3*b。二: 由一即可发现数字序列必然是递增的(要满足题目条件,较大的数必须大于或等于另一数的三倍),所以要使序列最长即从最小数1开始列举。三: 按此序列可以最长。1 3 9 27 81…(下一个数恰好是前一个的三
2022-03-12 10:53:57 234
原创 Codeforces Round #776 (Div. 3)-D. Twist the Permutation
原题链接:https://codeforces.com/contest/1650/problem/D解题思路: 仔细审题,会发现对第i个数字做的操作不会影响到后面的i+1…等数字。即可以反过来从最后一步开始还原到初始状态,如最后一步(设为第i步),需要做的处理是让他回到最后的位置,通过输入时记录的数字所处的位置对i求余,即可得到他移动到最后位置(还原到第i-1步状态)所需的步数。再将纪录的状态变到第i-1步,再同上进行处理,最后到第一步,即可得到结果。期间所走的步骤即是从头开始移动到最后输入状态的步骤。
2022-03-11 00:08:21 524
原创 士兵排队(分治思想)
题目描述: 在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点用整数坐标(x,y)表示。士兵们可以沿网格边往上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一行。题目要求: 编程计算使所有士兵排成一行需要的最少移动步数。输入格式:第1行是士兵数n,1≤n≤10000。接下来n行是士兵的初始位置,每行有2个整数x和y,-
2022-03-06 21:38:48 1469 1
原创 杭电oj1003
题目卡点我最开始的思路是套两个循环暴力解,但题目卡了时间。ac代码#include<iostream>using namespace std;int n[100005];//几种情景分析//1:数据全为负数//2:只有一个数据0//3:数据有正有负//4:数据全正 int main(){ int T,k=1; cin>>T; while(k<=T) { int N,i,j,a=1,b=1,m=1;
2021-09-11 18:03:54 286
原创 01背包问题(动态规划解决)
动态规划原理动态规划的核心:填表动态规划和分治法的相同点:把大问题拆分成小问题,再找大小问题间的递推关系。由最基本的小问题开始解决,逐渐解决大问题。动态规划和分治法的不同点:分治法不会记忆中间的过程,因此需要重复计算子问题。动态规划以填表的形式将已经解决了的小问题的答案都记录下来,如有需要可随时提用,避免了重复计算,节省了时间。在问题满足最优性原理后,动态规划解决问题的核心就在于填表,表填写完毕,最优解就找到了。最优性原理是动态规划的基础:即解决每一个小问题都采用最优的方式,因此其后的步骤可采用前面
2021-09-08 19:40:22 6893 4
原创 c++常用代码模板
(以从小到大排为例)(1)冒泡排序template<typename T>void BubbleSort(T a[];T n){ T i,j,item; for(i=0;i<n-1;i++) for(j=0;j<n-i-1;j++) if(a[j]>a[j+1]) { item=a[j]; a[j]=a[j+1];
2021-07-19 11:19:09 611
原创 杭电oj2092 整数解
//用循环对整数一个个进行判断是否符合两个条件//在整数的情况下,不会出现a/b的绝对值大于a*b的情况,所以将循环起点设为-abs(n),终点设为abs(n)以缩短时间 #include<iostream>#include<math.h>using namespace std;int main(){ int m,n;//写成while(cin>>m>>n&&n&&m)会导致(0 -64)此类m,n相反
2021-07-19 10:03:46 224
原创 实训记事薄(5)
实训进度刷题平台:杭电oj2072,2081,2091,1004,2057,2031,2033,2070,2071,2075,2089,2090,2092,2096刷题随记1;十六进制输出大小写字母一般默认输出小写字母,调整输出为大写
2021-07-19 09:57:28 74
原创 杭电oj 2032 杨辉三角
#include <iostream>using namespace std; int main(){ int n; while(cin>>n) { int num[1000],i,j,s=1; num[0]=1; for(i=1;i<n;++i) { num[s++]=1; for(j=1;j<i;++j) num[s++]=num[s-i]+num[s-i-1]; //注意找数字规律 num[s++]=1;
2021-07-15 21:14:14 130
原创 杭电oj2054
#include<iostream>#include<cstring>using namespace std;//strstr(str1,str2)函数:判断 str2是否是str1的子串,若是则返回str2在str1中首次出现的位置,若不是,则返回null //strcmp(c1,c2)函数:用于字符串比较,若相等返回0,若 c1>c2返回正值,c1<c2则返回负值 void deal0(char *c){ int n,i; n=strle
2021-07-15 21:04:15 183
原创 实训记事薄(4)
实训进度刷题平台:杭电oj2025-2030,2032,2040,2042,2054,2055刷题随记1:C++大小写字母转换核心:(利用ASCLL码实现大小写字母转换)//十进制//如A-a,ASCLL表中A=65,a=97char(int(A)+32);//a-Achar(int(a)-32);//求得对应数字,如Achar A;int n=A;//二进制//A-achar(int(A)|32);//a-Achar(int(A)&223);//合并写法c
2021-07-15 20:53:29 75
原创 杭电oj2018
#include<iostream>using namespace std;int main(){ int a[55]; int N,i; a[0]=1;//分别列出前三年母牛数 a[1]=2; a[2]=3; //a[3],第四年,计数时还未有小牛生产 for(i=3;i<55;i++) a[i]=a[i-1]+a[i-3];//有三项后即可开始递归 while(cin>>N&&am
2021-07-14 23:54:49 125
原创 实训记事薄(3)
实训进度刷题平台:杭电oj2016-2024,1197,2629刷题随记1:else if与if的区别若有多个if()语句,逐句判断执行若有多个else if()语句,一个执行后不会再对后面的else if语句进行判断(满足条件也不会执行),会执行最后的else语句。2:C++中取绝对值函数//头文件#include<cmath>//或#include<math.h>//处理int型abs(a)//返回a的绝对值(也可以对浮点数取绝对值)//处理double
2021-07-14 23:48:05 67
原创 杭电oj1062
#include<iostream>#include<cstring>using namespace std;int main(){ int N,n,i,j,k; int count=0;//记录空格分开的字符串中字符个数 char a[1000]; cin>>N; getchar(); //用以吸收输入N后的换行,避免影响后续字符串的读取 while(N--) { gets(a);//用gets()读取含空格的字符串 n=strle
2021-07-13 21:21:25 266
原创 实训记事薄(2)
实训进度刷题平台:杭电oj入门练手题:1091-1096简单操作题:2013-2015,2039试水题:1720,1062,2104,1064,2734,1170刷题随记1:不同进制间的转换//以十六进制输入数据x,y//再以十进制输出数据(C++)cin>>hex>>x>>y;cout<<dec<<x<<y;//以十六进制输入数据//再以十进制输出数据(C)scanf("%x%x",&x,&
2021-07-13 20:43:21 75
原创 实训记事薄(1)
实训进度刷题平台:杭电oj入门练手题:1000,1001,1089,1090简单操作题:2000-2002刷题随记1:注意题目描述,输入输出格式,题目描述中可能包含重复输入操作。2:需重复输入且不明次数时,可用while(cin>>n>>m)控制循环,如题1000所需。3:C++控制浮点数精度//参考博客文章#include<iomanip>//头文件不能忘输出处写法第一种//以保留两位小数为例cout<<setiosflags(io
2021-07-12 20:03:22 76
原创 2021-04-09
pta8-4报数void CountOff( int n, int m, int out[] ){int i,flag=1,count=0;for(i=0;i<n;i++)out[i]=0;//赋初值0for(i=0;;i++){if(in)i=0;//记录循环完一轮,需重头开始(因为需在每次循环完i++后判断,所以放在开始位置)if(out[i]0)count++;// count初值为0,此if语句在前if(countm) //到达退出点{out[i]=flag;fl
2021-04-09 16:16:15 78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人