您的位置:首页 > 其它

【喵 - 20160924】H - Efim and Strange Grade

2016-09-27 14:14 323 查看
题意:

给你字符串长度 n 和 时间限制 t

每1一个单位时间 你可以 选一个数字进行四舍五入

请在规定时间内改出最大的数字并输出

NOTE;

    1.对于9.3这种不需要做修改,直接就是最大的

    2.对于10.245564489这样的, 只需要找小数点后面第一个大于4的位数做四舍五入就可以

    3.要考虑进位 比如 999.5 199.5 遇到小数点就跳过

               进位的实现:分两种:1.需要自己添加1 如 99.996

                                                       2.不需要自己添加1 如 299.9996

利用k指向目前处理的位置。经过while循环(当s[k] == '.' || s[k] == '9' 时继续循环,每次循环都会导致k减少1) 若k最后为-1,说明是第一种,若为0说明是第二种,若都不是说明是类似于此 123.4569995

//Efim and Strange Grade
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a
, b
, c
;
string s;

int main(){
int n, t;
scanf("%d%d", &n, &t);
cin>>s;
int len = (int)s.size();
int k, h;
for(k=0; k<len; k++){
if(s[k] == '.') break;
}
for(h=k+1; h<len; h++){
if(s[h]>='5') break;
}
if(h==len) h--;
len=h;
while(1){
if(s[len] == '.') {
len--;
break;
}
if(len<=0 || t==0) break;
if(s[len]<'5') break;
else{
if((s[len-1]=='.' && s[len-2] == '9') || (s[len-1]!='.' && s[len-1]=='9')) { // 9.995 // 199.9995
int k = len;
s[k]='0'; //9.990 // 199.9990
k--; // // k = 6
while(s[k]=='9' || s[k]=='.') { //无论小数部分还是整数部分 遇见9不断进位 9.990
if(s[k]=='.') k--; //
else s[k]='0', k--;
} //0.000 //100.0000 k = 0
string ss = "\0";
ss += '1';
if(k==-1) {
for(int i=0; i<len; i++){ //len == 4
if(s[i]=='.') break;
ss+='0';
} //10
s.clear();
s = ss;
len = s.size()-1;//len == 1
break;
}
else
s[k] ++;//19.9995
t--;
len--;
}
else if(s[len-1]=='.') s[len-2] = s[len-2]+1, len--, t--;
else s[len-1] = s[len-1]+1, len--, t--;
}
if(t<0) t=0;
}
for(int i=0; i<=len; i++) cout<<s[i];
cout<<endl;
return 0;
}

参考:
http://blog.csdn.net/yhyyxt/article/details/52648639
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: