来源;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--;
}
}
通过标志物去控制,而不是使用刷新法