洛谷
字符串
cmp排序+sort
1012.拼数
cmp:reutrn a+b<b+a;
!单个数比较太麻烦,反正是Ai组合,返回比较模拟情况;
二分
1577.切绳子
1)二分的前提在于它寻找的范围很大,也就是指,找到某个特定要求的数值时,人为确定范围l=0,r=~,
2)二分终止条件:l>r
当他们跳出时,l=r=所求;
一般地,if mid<k,r=mid-1;
else l=mid+1;
1571.眼红(按顺序输出编号,使得不能简单地排序对比
二分寻找;
(结构体应该不行。
1873.砍树
2249.查找
vis 数组记忆化
贪心
1080.国王游戏
数据点
1 1.3
1 1.2
2 1
未处理完毕,在于cmp条件给写的是ls*rs<;但是2 1 这样的数据点就会让2被忽略
3817
相邻两数中减小的为后者就好了;
1208.牛奶==背包问题
暴力
取模方法:
取模运算n%p的结果与p的符号无关,由n决定。
(a+b)%p=(a%p+b%p)%p
(a-b)%p=(a%p-b%p)%p
(ab)%p=(a%pb%p)%p
(ab)%p=((a%p)b)%p
给你一个数a,让你求其b次连乘后的结果
当b很小时,一般的循环算法可以解决这个问题(O(B)),但是当b较大时呢
要知道1e18以上,就会long long int 也可能会溢出
而在数论方面这些数又该如何表示?怎样存储?
所以在此我们定义一个模数mod来代替输出
即a^ b=k1mod+t即t=a^b%mod
性质1:(a+b)%m=(a%m+b%m)%m
性质2:(ab)%m=(a%m*b%m)%m
当幂很大时,我们采取分治的思想处理问题
a^ b=((a^ (b/n)) ^ n)*a ^ (b%n);
ll quickmod(ll a,ll b,ll c)
{
if(b==1)
return a;
if(!(b&1))
{
ll t=quickmod(a,b/2,c);
return t*t%c;
}
else
{
ll t=quickmod(a,b/2,c);
return t*t%c*a%c;
}
1618.暴力!!
if(x<=999&&z<=999&&x<z){
int q=p/100%10,w=p/10%10,e=p%10,r=x/100%10,t=x/10%10,y=x%10,u=z/100%10,i=z/10%10,o=z/1%10 ;
if(q!=w&&q!=e&&q!=r&&q!=t&&q!=y&&q!=u&&q!=i&&q!=o&&
w!=e&&w!=r&&w!=t&&w!=y&&w!=u&&w!=i&&w!=o&&
e!=r&&e!=t&&e!=y&&e!=u&&e!=i&&e!=o&&
r!=t&&r!=y&&r!=u&&r!=i&&r!=o&&
t!=y&&t!=u&&t!=i&&t!=o&&
y!=u&&y!=i&&y!=o&&
u!=i&&u!=o&&
i!=o ){if(q*w*e*r*t*y*u*i*o==1*2*3*4*5*6*7*8*9){
cout<<p<<" "<<x<<" "<<z<<endl;
f=0;} }
}
for(int a=1;a<4;a++ ){
for(int b=1;b<4;b++ ){
for(int c=1;c<4;c++ ){
for(int d=1;d<4;d++ ){
for(int e=1;e<4;e++ ){
for(int f=1;f<4;f++ ){
for(int g=1;g<4;g++ ){
for(int h=1;h<4;h++ ){
for(int i=1;i<4;i++ ){
for(int j=1;j<4;j++ ){
if(a+b+c+d+e+f+g+h+i+j==n){
av[count][0]=a;av[count][1]=b;av[count][2]=c;av[count][3]=d;av[count][4]=e;av[count][5]=f;av[count][6]=g;av[count][7]=h;av[count][8]=i;av[count][9]=j;
count++;
}}}}}}}}}}}
cout<<count<<endl;
for(int l=0;l<count;l++){
for(int k=0;k<10;k++){
cout<<av[l][k]<<" ";
高精度
板子!
DP
1002.过河卒
数组标记每一个可能的范围组,对比模拟结束战斗
递推
1255.数楼梯
递推公式
F=F(n-1)+F(n-2)
(1) ll 与int 终会让你流泪
R69945148.数的计算(构造数
(1 记忆化数组可以防止栈溢出
搜索
1219.八皇后
DFS
1.模拟标记
2.在此基础上递推
3.递推回来时,保证所有搜索到,恢复标记
模拟
DFS
为什么不是贪心?给你所有模拟的结果,比较即可。
and 贪心我们认为其贪心策略是每一次选择的最优,本题是所有最后结果的最优,不能拆成小问题最贪。
2684.堆线段,覆盖,离线
结束工作最早的比较就好,动态改变
sort(a,a+n,cmp);
ll ans=0;
a[n].b=t+1;
ll at=1,temp=0;
for(int i=0;i<=n;i++){
if(a[i].b>at){
at=temp+1;
if(a[i].b>at){
ans=-1;break;
}
temp=a[i].e;//动态改变
ans++;
}
else if(a[i].e>temp)
temp=a[i].e;//
}
2191.旋转矩阵
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(val[i][j]==1)cout<<a[i][j];
}
}//1
for(int i=0;i<n;i++){
for(int j=n-1;j>-1;j--){
if(val[j][i]==1)cout<<a[i][n-j-1];
}
}//2
for(int i=n-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
if(val[i][j]==1)cout<<a[n-i-1][n-j-1];
}
}//3
for(int i=n-1;i>=0;i--){
for(int j=0;j<n;j++){
if(val[j][i]==1)cout<<a[n-i-1][j];
}
}//4
1098.字符展开
对条件的考虑缺失会导致更多的失误
3392.涂国旗
特点:
三种组合,总体最小,模拟DFS;
暴力 首先预处理,算出每一行如果分别换成R/W/B需要的成本
然后n^2的枚举前两种颜色的行数,第三种颜色就是剩下的,然后统计比较。注意每行不能小于1。
不用什么优化,如果你高兴的话还能使用前缀和优化。
位运算
1100.高低位交换
cout<<(n>>16)+(n<<16);
数据结构
1160.队列
其他
1.ios::sync_with_stdio(false);这个方法还是要解释一下的
在某些题目中,我们使用普通的cin和cout会超时,所以我们每次只能打scanf和printf,然后一堆的占位符巨麻烦),为什么cin和cout比scanf和printf用的时间多? 这是因为C++中,cin和cout要与stdio同步,中间会有一个缓冲,所以导致cin,cout语句输入输出缓慢,这时就可以用这个语句,取消cin,cout与stdio的同步,说白了就是提速,效率基本与scanf和printf一致。
取模方法:
取模运算n%p的结果与p的符号无关,由n决定。
(a+b)%p=(a%p+b%p)%p
(a-b)%p=(a%p-b%p)%p
(ab)%p=(a%pb%p)%p
(ab)%p=((a%p)b)%p
给你一个数a,让你求其b次连乘后的结果
当b很小时,一般的循环算法可以解决这个问题(O(B)),但是当b较大时呢
要知道1e18以上,就会long long int 也可能会溢出
而在数论方面这些数又该如何表示?怎样存储?
所以在此我们定义一个模数mod来代替输出
即a^ b=k1mod+t即t=a^b%mod
性质1:(a+b)%m=(a%m+b%m)%m
性质2:(ab)%m=(a%m*b%m)%m
当幂很大时,我们采取分治的思想处理问题
a^ b=((a^ (b/n)) ^ n)*a ^ (b%n);
ll quickmod(ll a,ll b,ll c)
{
if(b==1)
return a;
if(!(b&1))
{
ll t=quickmod(a,b/2,c);
return t*t%c;
}
else
{
ll t=quickmod(a,b/2,c);
return t*t%c*a%c;
}