题目链接
- 分析:
方法比较麻烦,不过觉得这个思路还是比较清晰的。考虑把n个0放到m个连续的1中间;(左边或右边有一个0)n - 1个0放到m个连续的1中间;(两侧各有一个0)n - 2个0放到m个连续的1中间
- 反思:
思路清晰,但是遇到这种判断情况是否符合题意的时候总是找不全需要判断的条件。此题第一次错就是因为在0插入1时,没有判断sv(比较短的1的数量)不能等于0而出错。还是太依赖judge,需要加强自己的思维对各种情况的考虑
bool ok(int zero, int one, int& sv, int& bn)
{
if (zero < 0 || one < 0)
return false;
sv = one / (zero + 1);
bn = one % (zero + 1);
if (sv == 1 || (sv == 2 && bn == 0))
return true;
return false;
}
void display(int n, int m, int sv, int bn)
{
int sn = n + 1 - bn;
int bv = sv + 1;
while (bn > 0 || sn > 0)
{
if (bn > 0)
{
bn--;
REP(i, bv)
putchar('1');
}
else if (sn > 0)
{
sn--;
REP(i, sv)
putchar('1');
}
if (n-- > 0)
putchar('0');
}
}
int main()
{
// freopen("in.txt", "r", stdin);
int n, m, sv, bn;
while (~RII(n, m))
{
if (ok(n, m, sv, bn))
{
display(n, m, sv, bn);
cout << endl;
}
else if (ok(n - 1, m, sv, bn))
{
putchar('0');
display(n - 1, m, sv, bn);
cout << endl;
}
else if (ok(n - 2, m, sv, bn))
{
putchar('0');
display(n - 2, m, sv, bn);
putchar('0');
cout << endl;
}
else
puts("-1");
}
return 0;
}