二分答案
二分答案与二分查找模板又有些许不同
[二分答案] [c++]123456789101112while(l<=r)//此处是小于等于{ mid=(l+r)>>1; if(check(mid)) { ans =mid; l=mid+1 } else r=mid-1;}
洛谷P2678 跳石头当一道题目直接求解答案会很困难,但是根据题意去验证答案会很简单,那么我们就利用逆向思维,直接枚举答案,利用刚刚学到的二分查找去查找答案,然后去直接按照题意验证答案,验证成功即可输出,所以二分更多的就是逆向思维
[跳石头] [c++]1234567891011121314151617181920212223242526272829303132333435363738#include <bits/stdc++.h>using namespace std;const int N=1e5+7;int a[N],ans;bool check(int x,int b[],int n,i ...
高精度四则
用数组存大整数 模拟人工加法的过程数组中正向小的索引存高位
[高精度加法] [c++]12345678910111213141516171819202122232425262728293031#include<bits/stdc++.h>using namespace std;const int N=1e6+10;vector<int> add(vector<int> &A,vector<int> &B)//加&是引用 不用创造新的动态数组{ vector<int> C; int t=0;//表示进位 for(int i=0;i<A.size()||i<B.size();i++) { if (i<A.size()) t+=B[i]; if (i<B.size()) t+=B[i]; C.push_back(t%10); t/=10; }if (t) C.push_b ...
字符串语法
字符串就是字符数组加上结束符\0常用的不忽略空格的字符串读入方式针对string类型(多用)
[读入1] [c++]12345略 string a; getline(cin,a);//这个只能读string不能读字符串 cout<<a.size()<<endl; return 0;
针对char类型
[读入2] [c++]12345略 char s[100]; fgets(s,100,stdin);//100表示最多读入字符 //stdin表示定义好的系统变量 return 0;
字符串流(形式有点像py列表)先把字符串初始化为字符串流 再从中读出 用法与cin相似
[字符串流] [c++]123456789101112略string s;getline(cin,s);stringstream ssin(s);//ssin自定义 s被初始化string str;while(ssin>>str)//读出 passint a,b;double c,d;string e;ssin>>a&g ...
二分查找
二分的本质是边界 对于整数二分与浮点数二分有不同的模板数组里的查找整数二分(单个)
[整数二分] [c++]12345678910111213141516171819202122232425262728293031323334353637int bsearch_one(int l,int r){ while(l<r) { int mid=(l+r)/2; if(q[mid]==goal) return mid; else if(q[mid]>goal) r=mid; else l=mid+1; } return -1;}寻找左分界点int bsearch_one(int l,int r){ while(l<r) { int mid=(l+r)/2; if(q[mid]>=goal) r=mid; //右边端点不断靠左边移动 else l=mid+1; } ...
快排 归并
[快排] [c++]1234567891011121314151617181920212223242526272829#include<bits/stdc++.h>using namespace std;const int N =1e6+10;int n,q[N];void quick_sort(int q[],int l,int r) //l r指起点终点索引{ if (l>=r) return; int x=q[l],//确定分界点 int i=l-1,j=r+1; //先移动指针 再进行比较判断 所以指针先放边界两侧外 while(i<j) { do i++; while(q[i]<x); do j--; while(q[j]>x);//通过分界点分到两侧 if(i<j) swap(q[i],q[j]); } quick_sort(q,l,j); //两侧分别递归 quick_sort(q,j+1,r);} ...
算法之前的自白
九月疫情,没能返校,因为对c语言有着一种敬畏,就花了一个月先把python的语法基础过了一遍,又通过张绪某(hhhh算法课不上就刷题的nt,当然祝你成功进队)发的邀请码,混入某不知名大专(西柚)的新生选拔赛里初步做一做。十月中旬到了学校才知道我的专业里c语言在大一下册才会开始教,大一上就学数分高代,我就咨询了一下竞赛部的大佬,他的原话:“py也就图一乐。”我便开始课下看mooc翁恺的课,狂补c语言的基础。然而这个学长话只说一半,到十一月初我肝完了语法基础,才告诉我整算法竞赛c++是必修项好家伙,竞赛部的选拔这时候已经只有两周了,我有点完美主义,又不想用比较拿手的python去做,我便又在acwing上学c++ 因为c++跟c的语法很像,我就一边看课一边刷里面的习题。机试的第一道题就一棒子把我打懵了,第一道就是动态规划,我丝毫没犹豫,就去找签到题先做,再看有没有能暴力整出来的题。最后出结果,虽然我总共提交次数最多,但是因为是ioi赛制没有罚时,运气好,最后一个名额擦着进了。缓了几天 这就开始更新算法章节了