Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)
Description
Vitya is studying in the third grade. During the last math lesson all the pupils wrote on arithmetic quiz. Vitya is a clever boy, so he managed to finish all the tasks pretty fast and Oksana Fillipovna gave him a new one, that is much harder.
Let's denote a flip operation of an integer as follows: number is considered in decimal notation and then reverted. If there are any leading zeroes afterwards, they are thrown away. For example, if we flip 123 the result is the integer 321, but flipping 130 we obtain 31, and by flipping 31 we come to 13.
Oksana Fillipovna picked some number a without leading zeroes, and flipped it to get number ar. Then she summed a and ar, and told Vitya the resulting value n. His goal is to find any valid a.
As Oksana Fillipovna picked some small integers as a and ar, Vitya managed to find the answer pretty fast and became interested in finding some general algorithm to deal with this problem. Now, he wants you to write the program that for given n finds any a without leading zeroes, such that a + ar = n or determine that such a doesn't exist.
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 10100 000).
Output
If there is no such positive integer a without leading zeroes that a + ar = n then print 0. Otherwise, print any valid a. If there are many possible answers, you are allowed to pick any.
Sample Input
4 11
5 33
Sample Output
2 10 0 21
Note
In the first sample 4 = 2 + 2, a = 2 is the only possibility.
In the second sample 11 = 10 + 1, a = 10 — the only valid solution. Note, that a = 01 is incorrect, because a can't have leading zeroes.
It's easy to check that there is no suitable a in the third sample.
In the fourth sample 33 = 30 + 3 = 12 + 21, so there are three possibilities for a: a = 30, a = 12, a = 21. Any of these is considered to be correct answer.
思路
题意:给出数字n,问是否存在一个数x,使得 x + flip(x) = n (其中 flip(x)为x的反转,反转后忽略前导0)
题解:对于前后两个对称位置,如果相等,则ans[i]=(num[i]+1)/2,ans[n-i-1]=num[i]/2,若不相等,考虑两种情况,一种是来自低位的进位,一种是来自高位的退位
- 当num[i] == num[n - i - 1] + 1 || num[i] == num[n - i - 1] + 11,说明第 i 位有来自低位的进位,因此将其还原即可,亦即使得num[i]--,num[i + 1] += 10;
 - 当num[i] == num[n - i - 1] + 10,说明第 i 位有来自高位的退位,因此使得第 n - i - 1 位也有来自高位的退位,,亦即使得num[n - i - 2]--,num[n - i - 1] += 10;
 
另外,对于n为 “1”开头的数值时,需要特判,因为这位1是由x 和 flip(x )相加而得的进位,至于大于 “1”的数字开头的数值不需要进位是因为 9 + 9 + 1 = 19,最多只能进1。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
char s[maxn],res[maxn];
int num[maxn];
bool check(int n)
{
	for (int i = 0;i < n / 2;)
	{
		if (num[i] == num[n - i - 1])	i++;
		else if ((num[i] == num[n - i - 1] + 1) || (num[i] == num[n - i - 1] + 11))  //来自低位的进位
		{
			num[i]--;
			num[i + 1] += 10;
		}
		else if (num[i] == num[n - i - 1] + 10)     //来自高位的退位
		{
			num[n - i - 2]--;
			num[n - i - 1] += 10;
		}
		else	return false;
	}
	if (n % 2 == 1)
	{
		if ((num[n/2]%2 == 1) || (num[n/2] > 18) || (num[n/2] < 0))	return false;
		else	res[n/2] = num[n/2]/2 + '0';
	}
	for (int i = 0;i < n / 2;i++)
	{
		if (num[i] > 18 || num[i] < 0)	return false;
		res[i] = (num[i] + 1) / 2 + '0';
		res[n - i - 1] = num[i] / 2 + '0';
	}
	return res[0] > '0';
}
int main()
{
	scanf("%s",s);
	int len = strlen(s);
	for (int i = 0;i < len;i++)	num[i] = s[i] - '0';
	if (check(len))	puts(res);
	else if (s[0] == '1' && len > 1)   //为 “1”开头的数值进行特判
	{
		for (int i = 0;i < len;i++)	num[i] = s[i + 1] - '0';
		len--;
		num[0] += 10;
		if (check(len))	puts(res);
		else	puts("0");
	}
	else	puts("0");
	return 0;
}
Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)的更多相关文章
- Codeforces Round #342 (Div. 2) D. Finals in arithmetic 贪心
		
D. Finals in arithmetic 题目连接: http://www.codeforces.com/contest/625/problem/D Description Vitya is s ...
 - Codeforces Round #342 (Div. 2)  C. K-special Tables(想法题)
		
传送门 Description People do many crazy things to stand out in a crowd. Some of them dance, some learn ...
 - Codeforces Round #342 (Div. 2)
		
贪心 A - Guest From the Past 先买塑料和先买玻璃两者取最大值 #include <bits/stdc++.h> typedef long long ll; int ...
 - Codeforces Round #342 (Div. 2) C. K-special Tables 构造
		
C. K-special Tables 题目连接: http://www.codeforces.com/contest/625/problem/C Description People do many ...
 - Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心
		
B. War of the Corporations 题目连接: http://www.codeforces.com/contest/625/problem/B Description A long ...
 - Codeforces Round #342 (Div. 2) A - Guest From the Past 数学
		
A. Guest From the Past 题目连接: http://www.codeforces.com/contest/625/problem/A Description Kolya Geras ...
 - Codeforces Round #342 (Div. 2) E. Frog Fights set 模拟
		
E. Frog Fights 题目连接: http://www.codeforces.com/contest/625/problem/E Description stap Bender recentl ...
 - Codeforces Round #342 (Div. 2)  B. War of the Corporations(贪心)
		
传送门 Description A long time ago, in a galaxy far far away two giant IT-corporations Pineapple and Go ...
 - Codeforces Round #342 (Div. 2)  A. Guest From the Past(贪心)
		
传送门 Description Kolya Gerasimov loves kefir very much. He lives in year 1984 and knows all the detai ...
 
随机推荐
- SqlServer--代码创建约束
			
约束-保证数据完整性先用设计器创建约束,再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制非空约束 (选择复选框)not null主键约束(PK)primary key co ...
 - ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
			
从供应商手中接手一个云平台(Windwos Azure)上的MySQL数据库,登录数据库时遇到错误: $mysql -uroot -p Enter password: ERROR 2002 (HY00 ...
 - YourSQLDba版本升级总结
			
在使用YourSQLDba做数据库备份.维护时,像其它软件一样,版本升级是不可避免的.因为YourSQLDba一直在不停更新版本.扩展功能.下面介绍一下升级YourSQLDba时的具体步骤和一些注意事 ...
 - SQL Server编程入门
			
SQL编程要比Java编程.C#编程简单许多,下面我们直接讲干货21:04:31 使用变量 局部变量 在T-SQL中,局部变量的名称必须以标记@作为前缀.T-SQL的局部变量其实和Java中的局部变量 ...
 - 还来一篇说下json_value 以及 json_query 的应用 (3)
			
上一篇说了一下openjson 的一些使用方法,这次再说一下在2016里面的查询取值,当然就是 json_query 和 json_value 这2兄弟了 首先 ) = '{"a" ...
 - MonjaDB —— 基于 Eclipse 的 MongoDB GUI 客户端工具(转载)
			
原文链接http://www.oschina.net/question/12_59707 MonjaDB 是一个 MongoDB 的 GUI 客户端工具,提供直观的 MongoDB 数据管理的功能,支 ...
 - 关于 Java 数组的 12 个最佳方法
			
1. 声明一个数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c&q ...
 - WordPress建站 新手入门
			
WordPress建站 新手入门教程系列 1. WordPress入门 之 什么是WordPress? 2. WordPress入门 之 搭建WordPress站点需要什么条件? 3. WordPre ...
 - Jquery操作cookie,实现简单的记住用户名的操作
			
一.jquery.cookie.js介绍 jquery.cookie.js是一个基于jquery的插件,一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cook ...
 - 设置 Unix,Linux环境下的NLS_LANG
			
设置 NLS_LANG 变量 1) 正确配置 LC_ALL 参数 2) 配置 telnet/ssh/SecureCRT 客户端的字符集 linux中可以用locale命令来查看 NLS_LANG设置, ...