题目链接: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. 【bzoj2100】[Usaco2010 Dec]Apple Delivery 最短路

    题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, she tr ...

  2. NOIP1998 提高组

    [NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12   121 应该组成12121而非121 ...

  3. 【Codeforces Round #404 (Div. 2)】题解

    A. Anton and Polyhedrons 直接统计+答案就可以了. #include<cstdio> #include<cstring> #include<alg ...

  4. [POI2007]ZAP-Queries && [HAOI2011]Problem b 莫比乌斯反演

    1,[POI2007]ZAP-Queries ---题面---题解: 首先列出式子:$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$$ ...

  5. Python3简单入门

    在Mac和Linux上运行Python时,请打开终端,然后运行python3 Mac OSX 正确地同时安装Python 2.7 和Python3:  http://www.jianshu.com/p ...

  6. async的基本用法

    1. async函数的基本形式 //函数声明 async function foo() {} //函数表达式 const foo = async function () {}; //对象的方法 let ...

  7. 【learning】杜教筛求欧拉函数前缀和

    我们考虑利用\(\sum\limits_{d|n}\varphi(d)=n\)这一性质来处理这个问题 设\(f(n)=\sum\limits_{i=1}^{n}\varphi(i)\) 那么我们可以得 ...

  8. FreeRTOS - 定时器使用注意

    1.只有进入定时器守护任务,从定时器命令队列取出命令,队列空间才会空出一个可用空间:所有定时器公用一个定时器队列 2.如果使用软件定时器,在调度器开始前,会自动创建一个定时器守护任务,configTI ...

  9. android中dip、dp、px、sp和屏幕密度

    1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这    这个 ...

  10. HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元

    题意:有N个座位,人可以选座位,但选的座位不能相邻,且旋转不同构的坐法有几种.如4个座位有3种做法.\( 1≤N≤1000000000 (10^9) \). 题解:首先考虑座位不相邻的选法问题,如果不 ...