目录
赛时榜
你说得对,但是
安禄山进长安——\(\huge{唐完了}\)。
T1.Efim与奇怪的成绩
贪心题+小模拟。先说结论:从小数点往后找到第一个可以四舍五入的位置,然后开始四舍五入。证明:首先,小数位数靠后的如果四舍五入,收益肯定是没前面的四舍五入收益高,而且如果前面的可以进行四舍五入,其结果显然会覆盖掉后面所有数字四舍五入的效果。想通了这个,剩下的就是模拟了。代码如下。
代码
#include<bits/stdc++.h>
using namespace std;
#define ri register int
#define il inline
int a,b,pl,ed;
char in,c[1000000001];
bool use,bn,ze;
int main()
{
freopen("grade.in","r",stdin);
freopen("grade.out","w",stdout);
c[0]='0';//必须初始化
scanf("%d%d",&a,&b);
for(ri i=1;i<=a;i++)//在前面留一个位置,应对999.99
{
scanf("%c",&in);
if(in>='0'&&in<='9')
{
c[i]=in;
continue;
}
if(in=='.')//记小数点位置
{
c[i]=in;
bn=true;
pl=i;
continue;
}
i--;//经典字符串防止读回车
}
ed=a;
while(c[ed]=='0')//记录有用数值终点,既防10.000又减下面的循环
{
ed--;
}
for(ri i=pl+1;i<=ed;i++)
{
int j=i;
while(b>0&&c[j]>='5')//可以四舍五入了
{
use=true;//标记
if(j-1==pl)//一直四舍五入到了个位
{
c[j-2]++;//直接加到个位上
}
else
{
c[j-1]++;//往上加
}
j--;
b--;
ed=j;//标记舍弃的位置
}
if(use==true)
{
break;
}
}
int h=pl-1;
while(h>0&&c[h]>'9')//继续进位
{
c[h]='0';
c[h-1]++;
h--;
}
if(c[ed]=='.')//特判114.的情况
{
ed--;
}
for(ri i=0;i<=ed;i++)
{
if(i==0&&c[i]=='0')//特判预留位是否输出
{
continue;
}
if(c[i]>='0'&&c[i]<='9')//正常输出
{
printf("%c",c[i]);
}
if(c[i]=='.')
{
printf("%c",c[i]);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
T2. 美丽的IP地址
标签:四舍五入,12,--,题解,2024,int,&&,ed,ri From: https://www.cnblogs.com/ywhhdjser-97/p/18244006to be continue