您的位置:首页 > 其它

Codeforces 719C Efim and Strange Grade 贪心+模拟

2016-12-25 17:02 423 查看
点击打开链接

题意:给定n,m分别代表字符串长度和可操作次数,接下来给出长度为n的字符串代表原始成绩,要求在m次内得到可以对这个成绩也就是实数的满足四舍五入的最大数,可以不使用完m次机会,并且整数部分只能进位一次

思路:找到离小数点最近的s[i]>='5'进位(如果从pos从后面开始效果是一样的,还浪费操作次数),模拟进位即可

例如(1.2456 ->1.25) (1.2456->1.246->1.25)

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+20;
char s
;
int main()
{
int n,t;
while(cin>>n>>t)
{
ans.clear();
scanf("%s",s+1);
bool flag=false;
int pos=-1,i;
for(i=1;i<=n;i++)
{
if(flag==false&&s[i]=='.')
{
flag=true;
}
if(flag&&s[i]>='5')
{
pos=i;//找到离小数点最近的5进位
break;
}
if(i==n)
break;//3 9.2
}
flag=false;
if(pos!=-1)
{
for(;i>=1&&t;i--,t--)
{
if(s[i]>='5')
{
s[i]='0';
if(s[i-1]=='.')
{
i--;
i--;
flag=true;
break;//
}
s[i-1]+=1;
}
else
break;//离.最近的之前都没有>=5的,退出即可
}
}
int p=i;
if(flag)
{
//整数部分进位
for(;i>=1;i--)
{
if(s[i]=='9'&& i==1)
{
printf("1");
s[i]='0';
break;
}
else if(s[i]=='9')
{
s[i]='0';
}
else
{
s[i]+=1;//只进位一次
break;
}
}
}
for(int i=1;i<=p;i++)
cout<<s[i];
cout<<endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: