递推算法与二分算法

2021-09-29 15:16

阅读:901

标签:最大   正方形   大小   n+1   ssi   思路   msu   cstring   deletion   递推算法与二分算法 递推算法: (一)斐波那契数列 以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列。 这个数列从第3项开始,每一项都等于前两项之和。 输入一个整数N,请你输出这个序列的前N项。 输入格式 一个整数N。 输出格式 在一行中输出斐波那契数列的前N项,数字之间用空格隔开。 数据范围 0n个待解决的游戏初始状态。 以下若干行数据分为n组,每组数据有5行,每行5个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。 输出格式 一共输出n行数据,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。 对于某一个游戏初始状态,若6步以内无法使所有灯变亮,则输出“-1”。 数据范围 0t; while(t--) { for(i=0;i>g[i];//存入字符串 char black[7][7]; int ans=100000; for(int op=0;op j & 1)//判断该位是否有1,有1则进行操作 { step++; turn(0,j); } } //要对前4排进行判断,如果为0则后一排就操作,否则不操作 for(i=0;i1≤i,j≤4 输入样例: -+-- ---- ---- -+-- 输出样例: 6 1 1 1 3 1 4 4 1 4 3 4 4 思路:对于这个4*4的矩阵,我们的操作有216次,我们可以进行暴力枚举 // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 //对每一位操作来判断 用操作数来对数组中的每一位进行判断是否要进行该操作, 操作后记录操作的路径,进行操作时注意该操作位进行了两次转换,状态不变因此我们需要再进行一次这个位置的单独转换 最后判断是否有无“+”,然后更新最优数组。 代码: #include #include #include using namespace std; #define x first //重定义first和second为x和y #define y second char g[6][6],black[6][6]; //得到数组的对应值 // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 int get(int x,int y) { return 4*x+y; } //转化每一位 void turn_one(int x,int y) { if(g[x][y]==‘-‘) g[x][y]=‘+‘; else g[x][y]=‘-‘; } //转换所有 void turn_all(int x,int y) { for(int i=0; ig[i]; } vector ans; //一共有2的16次方个操作数,对应每一位都有2个选择,一共有16个数 for(int op=0; op =x;而查找最终位置实际上是在求:f[i]>n>>q; for(i=0;i−10000≤n≤10000 输入样例: 1000.00 输出样例: 10.000000 代码: #include #include using namespace std; int main() { double x; cin>>x; double l=-10000,r=10000; while(r-l>1e-8) { double mid=(l+r)/2; if(mid*mid*mid>=x) r=mid; else l=mid; } printf("%lf",r); return 0; } (三)机器人跳跃问题 机器人正在玩一个古老的基于DOS的游戏。 游戏中有N+1座建筑——从0到N编号,从左到右排列。 编号为0的建筑高度为0个单位,编号为 i 的建筑高度为H(i)个单位。 起初,机器人在编号为0的建筑处。 每一步,它跳到下一个(右边)建筑。 假设机器人在第k个建筑,且它现在的能量值是E,下一步它将跳到第k+1个建筑。 如果H(k+1)>E,那么机器人就失去H(k+1)-E的能量值,否则它将得到E-H(k+1)的能量值。 游戏目标是到达第N个建筑,在这个过程中能量值不能为负数个单位。 现在的问题是机器人以多少能量值开始游戏,才可以保证成功完成游戏? 输入格式 第一行输入整数N。 第二行是N个空格分隔的整数,H(1),H(2),…,H(N)代表建筑物的高度。 输出格式 输出一个整数,表示所需的最少单位的初始能量值。 数据范围 1≤N,H(i)≤105 输入样例1: 5 3 4 3 2 4 输出样例1: 4 输入样例2: 3 4 4 4 输出样例2: 4 输入样例3: 3 1 6 4 输出样例3: 3 思路:这里要注意的是x可能会爆,因此当x大于最大值时,必然是成立的,我们就可以返回true代码: #include using namespace std; typedef long long ll; ll n,h[100010],i,j,maxn=-1; bool check(ll x) { bool flag=true; for(ll i=0;ix) x=x-(h[i]-x); else x=x+(x-h[i]); if(xmaxn) break; } return flag; } int main() { cin>>n; for(i=0;i>h[i]; maxn=max(maxn,h[i]); } ll l=0,r=100000; while(lN 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要满足: 形状是正方形,边长是整数 大小相同 例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。 当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么? 输入格式 第一行包含两个整数 N 和 K。 以下 N 行每行包含两个整数 Hi 和 Wi。 输入保证每位小朋友至少能获得一块 1×11×1 的巧克力。 输出格式 输出切出的正方形巧克力最大可能的边长。 数据范围 1≤N,K≤1051≤Hi,Wi≤105 输入样例: 2 10 6 5 5 6 输出样例: 2 思路:注意这里不可以用面积来进行判断,而应该分别用长和宽来分别除以边长,然后相乘代码: #include using namespace std; int n,k,s[100010]; int h[100010],w[100010]; bool check(int x) { int ans=0; for(int i=0;i=k) return true; else return false; } int main() { int i,j,maxn=-1; cin>>n>>k; for(i=0;i>h[i]>>w[i]; } int l=0,r=100010; while(l


评论


亲,登录后才可以留言!