3998. 变成1

  • 同上一题,自己用了比较繁琐的方法模拟了出来,但是果不其然的超时了。

    然后看了别人的解法,将原来题目的处理方式转换成了其他方法。用进制的方式统计操作的次数,而不是原题目的奇偶加减。

    但有点无法理解这两个不同的东西是怎么套上去的,太跳跃了有点懵圈。

// 正确代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    cin>>str;
    int n = str.size();
    int ans = 0;
    int jin = 0;
    for(int i=n-1;i>0;--i){
        int cur = jin + (str[i]-'0');
        if(cur == 0){
            jin = 0;
            ans++;
        }else if(cur == 1){
            jin = 1;
            ans+=2;
        }else{
            jin = 1;
            ans++;
        }
    }
    if(jin)ans++;
    cout<<ans<<endl;
    return 0;
}
// 超时代码
#include <bits/stdc++.h>
using namespace std;

// 判断是否 
bool isOne(string s){

	for(int i = s.size() - 1; i >= 0; i--){
		
		if(i == s.size() - 1 && s[i] == '0')
			return false;
		else if(i == s.size() - 1 && s[i] == '1' )
			continue;
			
		if(s[i] == '1')
			return false;
	}
	return true;
}

int main() {
	string str;
	cin >> str;
	int cnt = 0;
	
	while(1) {
		
		// 判断是否剩1
		if(isOne(str))
			break;
			
		// 判断奇偶 如果为奇数最低位 + 1 
		if(str[str.size() - 1] == '1') {
				
			// 直到遇到 0 停止
			int i;
			for(i = str.size() - 1; i >= 0; i--){
				
				// 遇到 0 则停止
				if(str[i] == '0'){
					str[i] = '1';
					break;
				} 
				else
					str[i] = '0';
				
			} 
			// 全部元素都遍历一遍说明需要进位 
			if(-1 == i)
				str.insert(0, 1, '1');
		}
		// 偶数右移 
		else{
			for(int i = str.size() - 1; i > 0; i--)
				str[i] = str[i - 1];
			
			// 删去最高位元素
			str.erase(0, 1); 
		}
		
		// 循环次数++ 
		cnt++;
		
	}
	cout << cnt;
}

posted on 2021-10-17 11:15  Atl212  阅读(27)  评论(0编辑  收藏  举报

导航