Codeforces 718A Efim and Strange Grade 程序分析
Codeforces 718A Efim and Strange Grade 程序分析
jerry的程序
using namespace std;
typedef long long ll;
string buf;
int i;
void up(int at)
{
at--;
if (at < 0)
{
buf = '1' + buf;
i++;
return;
}
if (buf[at] == '.') at--;
buf[at]++;
if (buf[at] == '9'+1)
{
buf[at] = '0';
up(at);
}
}
int main()
{
cin.sync_with_stdio(false); cin.tie(0);
int n, k;
cin >> n >> k >> buf;
while (buf[i] != '.') i++; i++;
while (i < buf.length() && buf[i] <= '4') i++;
if (i == buf.length())
{
cout << buf << endl;
return 0;
}
for (;buf[i] != '.' && k;i--) if (buf[i] >= '5')
{
buf.resize(i); up(i);
k--;
}
if (buf.back() == '.') buf.pop_back();
cout << buf << endl;
return 0;
}
首先,先找到小数点第一个后大于等于\(5\)的数位,如果没有的话直接输出原数。
从那个数位起,从后往前循环到小数点处,如果还当前数位大于等于\(5\)且有进位的机会,则先把这个数的结尾改成这个位置,因为之后的所有数都会被清零,然后调用up函数进位,如果有\(9\)的数继续递归,否则退出,如果整数部分首位还要进位,需要在最前面加上\(1\)。
最后注意最后一个字符如果是小数点要删去。
总结:用一个函数来执行进位,如果还有进位机会只需继续调用函数就行了,这样处理起来十分方便。
izrak的程序
#include <bits/stdc++.h>
#define FO(i,a,b) for (int i = (a); i < (b); i++)
#define sz(v) int(v.size())
using namespace std;
char s[200005];
int main() {
int l, t;
scanf("%d %d", &l, &t);
scanf("%s", s+1);
s[0] = '0';
for (int i = 0; i <= l; i++) {
if (s[i] == '.') {
for (int j = i+1; j <= l; j++) if (s[j] >= '5') {
s[j] = 0;
bool roundup = true;
t--;
for (int k = j-1; k > i; k--) {
// s[k]++
if (roundup) {
s[k]++;
if (s[k] >= '5' && t) {
s[k] = 0;
t--;
roundup = true;
} else roundup = false;
}
}
if (roundup) {
s[i] = 0;
for (int k = i-1; k >= 0; k--) {
s[k]++;
if (s[k] <= '9') break;
else s[k] = '0';
}
}
break;
}
}
}
if (s[0] != '0') {
printf("%s\n", s);
} else {
printf("%s\n", s+1);
}
}
这个程序读入时在数字前加上一个前导零,以便处理整数部分首位进位情况。
第一层循环找到小数点的位置,第二层循环找到小数点后第一位大于等于\(5\)的数字,第三层循环(最多进位到小数点),roundup记录是否继续进位,如果进位后还有大于等于\(5\)的数字且还有进位机会,则继续进位。如果第三层循环结束后,仍需继续进位,则在整数部分进位。进位时每进位一次,就把这一位设置为'\0',这样输出时只会输出到第一个'\0'的位置便结束。
注意最后需判断如果开始时加上的前导零仍是零,就不能输出。
总结:用bool变量roundup维护需不需要继续进位,进了位的位置就标为'\0',如果在小数点前面进位直接循环处理即可,这样处理起来不容易错。
Codeforces 718A Efim and Strange Grade 程序分析的更多相关文章
- CodeForces 718A Efim and Strange Grade (贪心)
题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次. 析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还 ...
- codeforces 719C. Efim and Strange Grade
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade 水题
C. Efim and Strange Grade 题目连接: http://codeforces.com/contest/719/problem/C Description Efim just re ...
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理
题目链接:http://codeforces.com/problemset/problem/719/C C. Efim and Strange Grade time limit per test 1 ...
- codeforces 373 A - Efim and Strange Grade(算数模拟)
codeforces 373 A - Efim and Strange Grade(算数模拟) 原题:Efim and Strange Grade 题意:给出一个n位的实型数,你可以选择t次在任意位进 ...
- Efim and Strange Grade
Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input standa ...
- CF719C. Efim and Strange Grade[DP]
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- 【22.17%】【codeforces718B】 Efim and Strange Grade
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- APM程序分析-AC_WPNav.cpp
APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...
随机推荐
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- Robot Framework(十七) 扩展RobotFramework框架——扩展Robot Framework Jar
4.4扩展Robot Framework Jar 使用标准JDK安装中包含的jar命令,可以非常简单地向Robot Framework jar添加其他测试库或支持代码.Python代码必须放在jar里 ...
- UVALive 3716 DNA Regions ——(扫描法)
乍一看这个问题似乎是很复杂,但其实很好解决. 先处理出每个点到原点的距离和到x正半轴的角度(从x正半轴逆时针旋转的角度).然后以后者进行排序. 枚举每一个点到圆心的距离,作为半径,并找出其他到圆心距离 ...
- cmake语法入门记录
刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...
- Linux设备驱动程序 之 延迟执行
长延迟 有些驱动程序需要延迟比较长的时间,即长于一个时钟滴答: 忙等待 如果想把执行延迟若干个时钟滴答,或者对延迟的精度要求不高,最简单的实现方法就是一个监视jiffies计数器的循环:这种忙等待的实 ...
- Ubuntu: Linux下查看本机显示器分辨率(xrandr)
版权声明:转载请注明出处 https://blog.csdn.net/JNingWei/article/details/75044598 Linux下查看本机显示器分辨率: $ xrandr Sc ...
- linux 中gcc的·安装、编译过程
一.安装gcc编译器 通过命令gcc -v查看当前的GCC版本 [root@localhost /]# gcc -v Reading specs from /usr/i386-glibc-2.1-li ...
- 慎用array_filter函数
array_filter (PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter - 用回调函数过滤数组中的单元 说明 array array_filter ( ...
- 【转】netty4.1.32 pipeline的添加顺序和执行顺序
原文:https://www.cnblogs.com/ruber/p/10186571.html 本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是可以 ...
- linux下如何批量替换多个文件中的某个字符串?
答: sed -i "s/<old_string>/<new_string>/g" `grep "<old_string>" ...