POJ2116题解(1.低阶:贪心 2.高阶:利用斐波那契的规律)

2024-02-05 08:38

本文主要是介绍POJ2116题解(1.低阶:贪心 2.高阶:利用斐波那契的规律),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.题目分析:

我这里介绍一种最简单的方法:就是将字符串转换成整数并将整数转换成字符串。将整数转换为字符串的时候有一个技巧就是从大往小去减权重,这样可以避免连续的1。这里说一下为什么:
为了避免前导零的情况,我们需要一直找权值小于等于整数的,找到一个就减去,那么无可非议它前面的那个权值是大于整数的,这个权值小于等于整数,说明下一个权值一定是大于整数减去当前的权重,所以一定不会出现连续1的情况。附上代码!

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int f[41];
void init()
{f[0]=1;f[1]=2;for(int i=2;i<41;i++){f[i]=f[i-1]+f[i-2];}return;
}
long long sum(string s)
{   long long ans=0;reverse(s.begin(),s.end());for(int i=0;i<s.size();i++){ans+=(s[i]-'0')*f[i];}return ans;
}
string get(long long a)
{string ans;int i=40;while(i>=0&&f[i]>a){i--;}if(i==-1)ans+='0';while(i>=0&&a>=0){if(a>=f[i]){ans+='1';a-=f[i];}elseans+='0';i--;}return ans;
}
int main()
{   init();string temp1,temp2;while(cin>>temp1>>temp2){long long tmp1,tmp2,tmp3;tmp1=sum(temp1);temp1=get(tmp1);tmp2=sum(temp2);temp2=get(tmp2);tmp3=tmp1+tmp2;string temp3=get(tmp3);for(int i=0;i<2+temp3.size()-temp1.size();i++){cout<<" ";}cout<<get(tmp1)<<endl;cout<<"+ ";for(int i=0;i<temp3.size()-temp2.size();i++)cout<<" ";cout<<get(tmp2)<<endl;cout<<"  ";for(int i=0;i<temp3.size();i++)cout<<"-";cout<<endl;cout<<"  ";cout<<get(tmp3)<<endl<<endl;}
}

2.额外的方法:(进阶)

其实大部分题解都是以上的这种方法,其实不好,除了贪心的观念用到了斐波那契的技巧,避免连续1的出现。其实仔细观察斐波那契数列,每一项都等于前一项和前两项的和,由此你有什么启发呢?
对的,也就是两个1可以合并成一个1的情况。由此又分为了多种情况,连续的两个一合并,如果前两项有1怎么办呢,我们可以假设当前位置是‘2’,我们仔细观察斐波那契数列,一个数的二倍等于什么呢?除了F[1]=2F[0],其余各项是不是都是2F[n]=F[n+1]+F[n-2];这里留下小小的思考,希望读者不要依赖转换的代码,去通过斐波那契的规律去解题。

这篇关于POJ2116题解(1.低阶:贪心 2.高阶:利用斐波那契的规律)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680340

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN