
算法
ღ江晚吟a
如果浮生若梦,万事无常,最终都归于尘土,那么也许我们的雄心壮志不过徒然为荒诞不经的玩笑而已。如果我们无可救药地执着于自己的意义,或许也只能安于自身的可笑。
展开
-
P1135 奇怪的电梯
思路注意判断每次上下移动是否符合要求。源码#include<bits/stdc++.h>using namespace std;int n,a,b;int k[205],vis[205];int ans=0x7ffffff;void dfs(int now,int step){ if(now==b){ ans=min(step,ans); return ; } if(step>ans){ return ; } if(now+k[now]<.原创 2021-03-30 15:23:36 · 142 阅读 · 0 评论 -
四阶数独
思路 int row=(x-1)/4+1; //设置行 1 2 3 4为第一行 先让x-1 可以确保 设置为 1 int col=(x-1)%4+1; // 设置列 也同理 int block=(row-1)/2*2+(col-1)/2+1; //设置每块 为啥row要*2 因为每两行有两块,则需要扩大两倍 源码#include<bits/stdc++.h>using namespace std;#define size 5int a[size*s.原创 2021-03-29 18:35:41 · 2000 阅读 · 0 评论 -
P1010 [NOIP1998 普及组] 幂次方(递归)
思路源码#include<bits/stdc++.h>using namespace std;//2 10 进入 do while() 首先判断 x&i为假 执行一次++i x右移位 i=1 x=1 //继续进入 if() 为真 i==1 s="2"+s 退出while 返回 s//do while(++i,x>>=1) 当while里面有一个为0(假),则退出while string run(int x,int i=0,str.原创 2021-03-24 20:34:40 · 226 阅读 · 0 评论 -
P1259 黑白棋子的移动(分治)
思路注意题目中的4个黑棋和4个白棋的情况。这是递归结束的标志源码#include<bits/stdc++.h>using namespace std;//int n;char a[200];void prt(char a[]){for(int i=0;i<=2*n-1+2;i++)cout<<a[i];cout<<endl;return ; }void sw(char a[],int x ,int y);void f(int m){.原创 2021-03-23 20:18:01 · 346 阅读 · 0 评论 -
P3612 [USACO17JAN]Secret Cow Code S
思路//当 N为原始的下一位// cow wco//发现把最后一位提前以后,两边的不变。//若要寻找大于初始的一半,则只需要减去前面的一半//但题目又把最后一个字符提前 则寻找减去 len+1//还有一点 若n-len-1等于0的话,则说明是原来的最后一位源码#include<bits/stdc++.h>using namespace std;int main(){ char a[105],ch; long long n,num=0; while(scanf("%.原创 2021-03-23 16:58:55 · 177 阅读 · 0 评论 -
P1928 外星密码(递归)(栈)
思路起初看到这题的时候,一脸懵逼不知道该怎么写,我是这么想的一来就把所有的数据都输入,但是然后就不知道怎么写了。当我看到别人的思路才没明白,原来一个一个输入才是正确的。1.先寻找左括号,然后输入次数,再把次数叠加(再次递归,因为继续输入的不是左括号,右括号,直接加上去就行了)2.找到了右括号,则直接返回就行。源码#include<bits/stdc++.h>using namespace std;string fun(){ int n; string s="",s1;.原创 2021-02-03 19:07:02 · 578 阅读 · 0 评论 -
P1044 [NOIP2003 普及组] 栈(卡特兰数)
卡特兰数什么是卡特兰数思路//初始化:当进栈的个数为0,1 时 方法为1;//n个数 当x为最后一个出栈 前面有f[x-1]种方法 后面有f[n-x]种//方案数:f[x-1]*f[n-x]//每个数都可能最后一个出去。//所以方案数为每种情况的和。源码#include<bits/stdc++.h>using namespace std;//初始化:当进栈的个数为0,1 时 方法为1;//n个数 当x为最后一个出栈 前面有f[x-1]种方法 后面有f[n-x]种.原创 2021-03-21 18:42:45 · 237 阅读 · 0 评论 -
P1002 [NOIP2002 普及组] 过河卒(动态规划)
思路有递推可以知道。到点(x,y)的方法等于到点(x-1,y)+(x,y-1)的方法和。则可以写出ans[i][j]=max(ans[i][j],ans[i-1][j]+ans[i][j-1]);由马的点可以知道,有9个点不能走,所以要标记一下。最后一点如果马的坐标很小的话,马可以走的点可能为负数,则可以把棋盘+2源码#include<bits/stdc++.h>using namespace std;const int dx[]={0,-1,-2,-2,-1,1,2,.原创 2021-03-21 18:11:06 · 606 阅读 · 0 评论 -
next_permutation的用法
定义next_permutation(start,end)表示在[ start,end)内存的数组中产生严格的下一个字典序排序例题P1706 全排列问题#include<bits/stdc++.h>using namespace std;typedef long long LL;int a[10];int main(){ long long A,B,C,x,y,z,cnt=0; cin>>A>>B>>C; for(int i=1;i&原创 2021-03-18 19:31:54 · 547 阅读 · 0 评论 -
P1177 【模板】快速排序
思路确定一个基准,在基准左边找比基准大的数,右边找比基准小的数,然后交换。(基准也可以被交换)源码#include<iostream>#include<algorithm>using namespace std;int n,a[100005];///algorithm算法 /* int main(){ int a[100005]; int n; cin>>n; for(int i=0;i<n;i++) cin>>.原创 2021-03-17 17:22:21 · 122 阅读 · 0 评论 -
高精度常用模板
核心高精度是用数组来存储数值,低位在前,高位在后,所以输出要逆序输出。1.用于阶乘//c表示传过来的数,在主函数中可以用for循环//注意 初始化 s[1]=1void jc(int c){ for(int i=1;i<=len;i++) s[i]=s[i]*c; for(int i=1;i<=len;i++){ if(s[i]>=10){ long long add=s[i]/10; s[i+1]+=add; s[i]%=10; if(i+原创 2021-03-16 20:10:41 · 627 阅读 · 0 评论 -
19章 位运算与进制转换
1.进制转换1.1整数进制转换例:10进制转16进制 (114514)10=(BF52)16方法:除16取余法1.2整数进制转换例题方法1:#include <stdio.h>#include <ctype.h>int main () { int n, m, i, sum = 0, time = 1;//sum是用来存放转换成十进制后的数 char a[30];//输入的数组 int b[30];//存放每一位转换成数是多少的数组原创 2021-02-22 22:55:24 · 1085 阅读 · 3 评论 -
网页跳转(栈)
描述蒜头君每天都在用一款名为 “蒜厂浏览器” 的软件。在这个浏览器中,一共三种操作:打开页面、回退和前进。它们的功能如下:打开页面:在地址栏中输入网址,并跳转到网址对应的页面; 回退:返回到上一次访问的页面; 前进:返回到上次回退前的页面,如果上一次操作是打开页面,那么将无法前进。现在,蒜头君打开浏览器,进行了一系列操作,你需要输出他每次操作后所在页面的网址。输入第一行输入一个整数 t(0 < t <= 10),表示有 t 组数据。 第二行输入一个整数 n(0 <原创 2021-01-27 12:36:45 · 503 阅读 · 0 评论 -
括号匹配(栈)
思路就是创建一个栈,然后将左括号进栈,之后寻找右括号,找到了,则匹配成功。若最后栈中还有括号剩余,则输出NO源码#include<bits/stdc++.h>using namespace std;char s[500005];stack<int> st;int ans[500005];int main(){ int len; bool f; cin>>s; len = strlen(s); f = true; for(int i = .原创 2021-01-27 11:42:31 · 160 阅读 · 0 评论 -
关于求最大公约数和最小公倍数
最大公约数gcd辗转相除法int gcd(int x, int y){ int z = y; while(x%y!=0) { z = x%y; x = y; y = z; } return z;}穷举法int gcd(int x,int y){ int temp = 0; for(temp = x ; ; temp-- ) { if(x%temp == 0 && y%temp==0) break;原创 2021-01-17 19:39:53 · 175 阅读 · 0 评论