CF625D Finals in arithmetic-构造,贪心,细节
题目链接: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-构造,贪心,细节的更多相关文章
- 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) D. Finals in arithmetic(想法题/构造题)
传送门 Description Vitya is studying in the third grade. During the last math lesson all the pupils wro ...
- LA 6979 Known Notation 构造+贪心 铜牌题
题意:给出一个字符串,有两种操作: 1.插入一个数字 2.交换两个字符 问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...
- Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列
A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a, ...
- Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg
A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- EC R 86 D Multiple Testcases 构造 贪心 二分
LINK:Multiple Testcases 得到很多种做法.其中O(n)的做法值得一提. 容易想到二分答案 check的时候发现不太清楚分配的策略. 需要先考虑如何分配 容易发现大的东西会对小的产 ...
- Codeforces Round #650 (Div. 3) D. Task On The Board (构造,贪心)
题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解 ...
- cf1082D Maximum Diameter Graph(构造+模拟+细节)
QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...
随机推荐
- axios post提交数据格式不对的问题
需要格式化一下 this.$http({ method: "post", url: "/chinacountry/index.php/home/Search/index& ...
- react 入门与进阶教程
react 入门与进阶教程 前端学习对于我们来说越来越不友好,特别是随着这几年的发展,入门门槛越来越高,连进阶道路都变成了一场马拉松.在学习过程中,我们面临很多选择,vue与react便是一个两难的选 ...
- [SCOI2013]摩托车交易 kruskal重构树(最大生成树) 倍增
---题面--- 题解: 这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是inf没开到LL范围.... 首先我们需要找到任意两点之间能够携带黄金的上限值,因为是在经过的道路权值中取min, ...
- BZOJ3196 & 洛谷3380:二逼平衡树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problemnew/show/P3380 (题 ...
- BZOJ4196:[NOI2015]软件包管理器——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...
- Codeforces Round #466 (Div. 2) E. Cashback
Codeforces Round #466 (Div. 2) E. Cashback(dp + 贪心) 题意: 给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\) 定义序列中一段长度为 ...
- CentOS 6.5 下 QT4 连接 mysql 数据库的步骤
QT4 的安装请参考: CentOS 6.5 下安装 QT 4 mysql 的安装请参考: CentOS 6.5 下安装配置 mysql 1. 预防万一,先安装一下mysql-devel(一定要装!) ...
- ACE前摄器Proactor模式
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html 当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web ...
- shell中的$* $@
shell中$*与$@的区别 关于$* 和 $@的 一点 认识 同是菜鸟一起学习 $* 所有的位置参数,被作为一个单词. 注意:"$*"必须被""引用. $@ ...
- 如何在阿里云服务器部署Django
这段时间一直在搞我的网站——大学易,一个大学生评课网站,主要是提供课程的详尽信息(比如老师会不会经常点名,有没有期中考试),课程资料的下载等等. 这篇文章主要是分享给那些菜鸟,就是像我一样完全没有搞过 ...