题目链接:http://codeforces.com/contest/625/problem/D

题意: 给你一个数字字符串s,长度1e6,算是一个大数吧,让你找到一个x,使得,x加上  逆转(x)=s

例如33,能找到 12,逆转(12)=21

12+21=33

输出的x不允许有前导零,例如输出 032是错的,只能输出32,如果输出320,她的逆转是023,他们的和是320+23

其实,X和逆转X就是一对回文串

这个题细节很多,坑点也很多。参考了大神的题解,下面的解释来自大神的博客。写得太好啦。ORZ。http://blog.csdn.net/viphong/article/details/50668657

总得来说,我们就是要把长度为n位的一个串拆成两个长度n位的回文串

我们要尽可能让 S 的第i位和第n-1-i位相同,只有这两位相同,才可能分解出两个一样的数字构成回文串

我们令l=头,r=尾

逐个比较, 如果 s[l]==s[r] ,则l,r向中间移动一格,

否则,我们看能否通过进位使得他们相等, 对于l,它左边是已经确定的,就别动了,只考虑l的往右退位,

同样,对于r,它的右边是确定的,只考虑r-1位的退位

也就是三种情况:

1、  左边l退位,  if ( s[l] -1 == s[r] )

2、右边r-1退位,r增10   if (s[l] == s[r]+10 )

3、左右同时退位       if ( s[l]-1 == s[r] +10 )

如果满足哪种情况 则作相应操作,如果都不满足 则必然不可能构造出一个X

要注意的是  当r-l==1的时候, 情况1不可能成立,也就是不只左边往右退位,而右边不进位,情况3同理

判断完整个串后,还要考虑奇偶,如果是偶数长度必然没问题,如果是奇数长度,要看 最中间的那个位的数,是否为偶数,如果为奇数,则无法分解成2个回文串

至此,对于其余的位,只需要 靠左的第i位 构造为 (S【i】+1/)2,右边第n-1-i为s【i】/2

前导零的问题:

//我们求答案的过程0abc,cba0,这种情况是合法的,但是我们要输出cba0

//我们已经尽量让奇数的一边在前面了,如果得到的答案还有前导零,表明答案是,0ab0,的情况,这种情况两个数都有前导零,显然也不合法

------------以上的构造基于,长度为n位的一个串拆成两个长度n位的回文串

还有一种情况,长度为n位的穿 是由长度 n-1的回文串构造而成

如 78+87=165 ,这时我们要特判一下

即,先把 首位1,加到第二位,变成(16)(5)

然后再按照上面的方法再判断一次, 注意第一次的判断已经改变了子串的数字,需要copy一下备份

//CF 625D

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
char bas[maxn];
int num[maxn];
int ans[maxn];
int check(int *t, int len)
{
int i;
for(i = 0; i <= len/2; i++){
int l = i;
int r = len - i - 1;
if(t[l] == t[r]) continue;
else{
if(t[l]-1 == t[r] && r-l!=1){
t[l]--;
t[l+1]+=10;
}
else{
if(t[l]-1 == t[r]+10){
t[l]--;
t[l+1]+=10;
if(r-l==1) continue;
t[r]+=10;
t[r-1]--;
}
else if(t[l] == t[r]+10 && r-l!=1){
t[r]+=10;
t[r-1]--;
}
else{
return 0;
}
}
}
}
if(len&1){
if(t[len/2]&1) return 0;
if(t[len/2]<0) return 0;
if(t[len/2]>18) return 0;
ans[len/2] = t[len/2]/2;
}
for(int i = 0; i < len/2; i++){
if(t[i] > 18) return 0;
if(t[i] < 0) return 0;
ans[i] = (t[i]+1)/2;
ans[len-i-1] = t[i]/2;
}
return ans[0] > 0;
//我们求答案的过程0abc,cba0,这种情况是合法的,但是我们要输出cba0
//我们已经尽量让奇数的一bian在前面了,如果得到的答案还有前导零,表明答案是,0ab0,的情况,这种情况两个数都有前导零,显然不合法
}
int main(){
scanf("%s", bas+1);
int len = strlen(bas+1);
for(int i = 1; i <= len; i++) num[i] = bas[i] - '0';
int flag = 0;
if(check(num+1, len)){
flag = 1;
for(int i = 0; i < len; i++) printf("%d", ans[i]);
printf("\n");
}
else{
for(int i = 1; i <= len; i++) num[i] = bas[i] - '0';
if(num[1] == 1){
num[2] += 10;
if(check(num+2, len-1)){
flag = 1;
}
if(flag){
for(int i = 0; i < len - 1; i++){
printf("%d", ans[i]);
}
printf("\n");
}
else{
printf("0\n");
}
}
else{
printf("0\n");
}
}
return 0;
}

CF625D Finals in arithmetic-构造,贪心,细节的更多相关文章

  1. 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 ...

  2. 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 wro ...

  3. LA 6979 Known Notation 构造+贪心 铜牌题

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...

  4. Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列

    A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a, ...

  5. Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg

    A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...

  6. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  7. EC R 86 D Multiple Testcases 构造 贪心 二分

    LINK:Multiple Testcases 得到很多种做法.其中O(n)的做法值得一提. 容易想到二分答案 check的时候发现不太清楚分配的策略. 需要先考虑如何分配 容易发现大的东西会对小的产 ...

  8. Codeforces Round #650 (Div. 3) D. Task On The Board (构造,贪心)

    题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解 ...

  9. cf1082D Maximum Diameter Graph(构造+模拟+细节)

    QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...

随机推荐

  1. Django 2.0 学习(08):Django 自动化测试

    编写我们的第一个测试 确定bug 幸运的是,在polls应用中存在一个小小的bug急需修复:无论Question的发布日期是最近(最后)的日期,还是将来很多天的日期,Question.was_publ ...

  2. bzoj1208: [HNOI2004]宠物收养所 (sbt)

    切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解 ...

  3. [NOI2001]炮兵阵地 状压DP

    题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...

  4. BZOJ1027 [HNOI2004]打鼹鼠 【dp】

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3647  Solved: 1746 [Submit][Sta ...

  5. HDU.2640 Queuing (矩阵快速幂)

    HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...

  6. SELECT LAST_INSERT_ID() 的使用和注意事项

    SELECT LAST_INSERT_ID() 的使用和注意事项 尊重个人劳动成果,转载请注明出处: http://blog.csdn.net/czd3355/article/details/7130 ...

  7. 一个完整的upstart脚本分析

    基本概念可以了解 http://www.mike.org.cn/articles/understand-upstart/ http://blog.fens.me/linux-upstart/ http ...

  8. stout代码分析之八:cache类

    stout中实现了LRU cache.cache的成员如下: public: typedef std::list<Key> list; typedef std::tr1::unordere ...

  9. Centos6.5+Python2.7 +ffmpeg+opencv2自动安装脚本

    今天安装opencv折腾了多个小时,为以后安装少走弯路,脚本安装 完整 脚本如下: #! /bin/bash sudo yum install -y gcc g++ gtk+-devel libjpe ...

  10. http中有关缓存相关的几个字段

    转载自:http://blog.csdn.net/lifeibo/article/details/5979572 Expires.Cache-Control.Last-Modified. ETag是R ...