我没参加这次考试,准备过几天参加,不过看了你的题目描述,我自己做了一下 核心思想就是从第0位开始,如果希望把该位变成0,则对下一位做操作 比如 10101,想把s[0]变成0,则对s[1]做操作,得到 01001,想把s[1]变成0,对s[2]操作,得到00111,想把s[2]变成0。。。。最后判断最后一位是否为0就行了 #include <iostream> (720)#include <string> using namespace std; void _flip(string &s, int i) { s[i] = s[i] == &#39;0&#39; ? &#39;1&#39; : &#39;0&#39;; } void flip(string &s, int i) { _flip(s, i - 1); _flip(s, i); if (i < s.length() - 1) { _flip(s, i + 1); } } int judge(string s) { int cnt = 0; for (int i = 0; i < s.length() - 1; i++) { if (s[i] == &#39;1&#39;) { flip(s, i + 1); //为了让当前第i位变成0,对i+1位做翻转操作 cnt++; } } return s.back() == &#39;0&#39; ? cnt : -1; } int main() { int N; cin >> N; while (N--) { string s; cin >> s; int ret = judge(s); if (ret == -1) { cout << "NO" << endl; } else { cout << ret << endl; } } return 0; }

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务