一个答辩思考的 Maximum Rounding

来源;Codeforces Round 891 (Div. 3) 

        B. Maximum Rounding


        虽然我的想法存在问题导致超时,但还是想先记录一波。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
	string str,str_;
	int number, i;
	scanf("%d",&number);
	while(number){
		cin>>str_;
		str='0'+str_;
		for(i=str.length()-1; i>0; i--){
			if(str[i]<'5') str[i]='0';
			else if(str[i]>='5') str[i]='0',str[i-1]+=1;
			if(str>'0'+str_) str_=str.substr(1,str.length());	
		}
		if(str[0]=='0')	str=str.substr(1,str.length());
		if(str.length()>str_.length()) cout<<str<<endl;
		else if(str>=str_) cout<<str<<endl;
		else if(str<str_) cout<<str_<<endl;
		str_.clear();
		number--;
	}
}

        思考依据:实时更新确切进位max形态

        漏洞:遍历次数过多

        修改点:减少无效遍历部位,精确比较关键部位


#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
	string str, str_, flag;
	int number, i;
	scanf("%d",&number);
	while(number){
		cin>>str_;
		str='0'+str_;
		flag=str.length()-1;
		for(i=str.length()-1; i>0; i--){
			if(str[i]<'5') str[i]='0';
			else if(str[i]>='5'){
				str[i]='0',str[i-1]+=1;
				str_=str;
			}
		}
		if(str_[0]=='0') str_=str_.substr(1,str_.length());
		cout<<str_<<endl;
		str_.clear();
		number--;
	}
}

        经减少无效遍历后,超时问题得到一定的改善。但在test7测试点再次超时。

        问题:赋值操作过多导致

        修改点:减少无效赋值操作,精确赋值操作


#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
	string str;
	int number, i, flag;
	scanf("%d",&number);
	while(number){
		cin>>str;
		str='0'+str;
		flag=str.length();
		for(i=str.length()-1; i>0; i--){
			if(str[i]<'5') continue;
			else if(str[i]>='5'){
				str[i]=0,str[i-1]+=1;
				flag=i;
			}
		}
		if(str[0]=='0'){
			for(i=1;i<str.length();i++)
				if(i<flag) printf("%c",str[i]);
				else printf("0");
		}else if(str[0]!='0'){
			for(i=0;i<str.length();i++)
				if(i<flag) printf("%c",str[i]);
				else printf("0");
		}
		printf("\n");
		str.clear();
		number--;
	}
}

        通过标志物去控制,而不是使用刷新法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值