一开始没有理解题意:这道题是说,每次把手头上的魔法币全都投入。
这道题一开始用了回溯,只通过80%,大数据通不过。
#include <iostream>
#include <string>
using namespace std;
bool helper(int need, int have, string &s)
{
if(need == 0) return true;
if(need < 0) return false;
s.push_back('1');
if(helper(need - have - 1, 2 * have + 1, s))
return true;
s.pop_back();
s.push_back('2');
if(helper(need - have - 2, 2 * have + 2, s))
return true;
s.pop_back();
return false;
}
int main()
{
int n;
while(cin >> n){
string s;
helper(n, 0, s);
cout << s << endl;
}
}
后来看了别人的思路,才发现应该好好利用机器1产生的是奇数,机器2产生的是偶数这个隐含条件。如果n是偶数,说明最后一次一定是用了机器2,那么倒数第二次之后剩下的一定是(n-2)/2.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
string s= ("");
while( n )
{
if( n % 2 )
{
n = (n-1)/2;
s = '1'+ s ;
}
else
{
n = (n-2)/2;
s = '2'+ s;
}
}
cout << s;
return 0;
}