CodeForces 625D Finals in arithmetic
神奇的构造题,我的思路比较奇葩。搞了好久,看到WA on 91我绝望了,然后自己造数据,找到了错误,总算是AC了,现在是凌晨0:24分,看到AC之后,感动China!
我写的代码无比的长。。。。。应该有很简单的方法吧。。。。。没想到。
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <vector>
using namespace std; const int maxn = + ;
char s[maxn];
int a[maxn], b[maxn], sum[maxn], flag[maxn];
int tmpa[maxn], tmpb[maxn], ans[maxn];
int nb[maxn];
int len; void read()
{
scanf("%s", s);
for (int i = ; s[i]; i++) b[i + ] = s[i] - '';
nb[] = b[] * + b[]; for (int i = ; s[i]; i++) nb[i] = s[i] - '';
} void init()
{
len = strlen(s);
memset(flag, , sizeof flag);
} bool check1()
{
for (int i = ; i <= (len + ) / ; i++)
{
if (sum[i] % == ) a[i] = sum[i] / , a[len - i + ] = sum[i] / ;
else a[i] = sum[i] / + , a[len - i + ] = sum[i] - a[i];
} for (int i = ; i <= len; i++) tmpa[i] = a[i];
for (int i = ; i <= len; i++) tmpb[i] = a[len - i + ]; int k = ;
for (int i = ; i <= len; i++)
{
ans[i] = (tmpa[i] + tmpb[i] + k) % ;
k = (tmpa[i] + tmpb[i] + k) / ;
} for (int i = ; i <= len; i++)
if (b[len - i + ] != ans[i]) return ;
return ;
} bool work1()
{
bool fail = ; init(); for (int i = len; i >= len / + ; i--)
{
int id_now = i, id_pre = len - i + ; if (i == len)
{
if (b[i] == ) { fail = ; break; } sum[id_now] = b[id_now]; sum[id_pre] = b[id_now];
flag[id_now] = ; flag[id_pre] = ; if (b[id_now] == b[id_pre]) flag[id_pre + ] = ;
else if (b[id_now] + == b[id_pre]) flag[id_pre + ] = ;
else { fail = ; break; }
} else
{
int num_now, num_pre;
num_now = b[id_now] - flag[id_now + ]; if (num_now == )
{
if (b[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else if (b[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else { fail = ; break; }
}
else if (b[id_now] == && flag[id_now + ])
{
if (b[id_pre] == || b[id_pre] == )
{
flag[id_now] = ;
if (b[id_pre] == ) flag[id_pre + ] = ;
sum[id_now] = ;
sum[id_pre] = ;
}
else { fail = ; break; }
}
else
{
num_now = num_now + flag[id_pre] * ;
num_pre = b[id_pre] + flag[id_pre] * ; if (num_now == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
} else if (num_now + == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
}
else { fail = ; break; }
}
}
if (id_now == id_pre&&sum[id_pre] % != ) { fail = ; break; }
} if (!check1()) fail = ; return fail;
} bool check2()
{
memset(tmpa, , sizeof tmpa);
memset(tmpb, , sizeof tmpb); for (int i = ; i <= (len + ) / ; i++)
{
if (sum[i] % == ) a[i] = sum[i] / , a[len - i + ] = sum[i] / ;
else a[i] = sum[i] / + , a[len - i + ] = sum[i] - a[i];
} for (int i = ; i <= len; i++) tmpa[i] = a[i];
for (int i = ; i <= len; i++) tmpb[i] = a[len - i + ]; int k = ;
len++;
for (int i = ; i <= len; i++)
{
ans[i] = (tmpa[i] + tmpb[i] + k) % ;
k = (tmpa[i] + tmpb[i] + k) / ;
} for (int i = ; i <= len; i++)
if (b[len - i + ] != ans[i]) return ;
return ;
} bool work2()
{
bool fail = ; init(); len--; for (int i = len; i >= len / + ; i--)
{
int id_now = i, id_pre = len - i + ; if (i == len)
{
sum[id_now] = + nb[id_now]; sum[id_pre] = + nb[id_now];
flag[id_now] = ; flag[id_pre] = ; if (nb[id_now] + == nb[id_pre]) flag[id_pre + ] = ;
else if (nb[id_now] + + == nb[id_pre]) flag[id_pre + ] = ;
else { fail = ; break; }
} else
{
int num_now, num_pre;
num_now = nb[id_now] - flag[id_now + ]; if (num_now == )
{
if (nb[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else if (nb[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else { fail = ; break; }
}
else if (nb[id_now] == && flag[id_now + ])
{
if (nb[id_pre] == || nb[id_pre] == )
{
flag[id_now] = ;
if (nb[id_pre] == ) flag[id_pre + ] = ;
sum[id_now] = ;
sum[id_pre] = ;
}
else { fail = ; break; }
}
else
{
num_now = num_now + flag[id_pre] * ;
num_pre = nb[id_pre] + flag[id_pre] * ; if (num_now == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
} else if (num_now + == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
}
else { fail = ; break; }
}
}
if (id_now == id_pre&&sum[id_pre] % != ) { fail = ; break; }
} if (!check2()) fail = ; return fail;
} int main()
{
read();
init();
if (!work1())
{
for (int i = ; i <= len; i++) printf("%d", a[i]);
printf("\n");
}
else
{
if (b[] == )
{
if (!work2())
{
for (int i = ; i <= len - ; i++) printf("%d", a[i]);
printf("\n");
}
else { printf("0\n"); }
}
else { printf("0\n"); }
}
return ;
}
CodeForces 625D 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 ...
- 【Codeforces 115D】Unambiguous Arithmetic Expression
Codeforces 115 D 题意:给一个没有括号的表达式,问有多少种添加括号的方法使得这是一个合法的表达式?输入可能有正负号.加减乘除.数字. 思路1: 这是不能过的\(naive\)的\(dp ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- 【codeforces 604D】Moodular Arithmetic
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces 710 D. Two Arithmetic Progressions
Description \(x=a_1k+b_1=a_2l+b_2,L\leqslant x \leqslant R\) 求满足这样条件的 \(x\) 的个数. Sol 扩展欧几里得+中国剩余定理. ...
- Codeforces Round #342 (Div. 2)
贪心 A - Guest From the Past 先买塑料和先买玻璃两者取最大值 #include <bits/stdc++.h> typedef long long ll; int ...
- Codeforces Round #342 (Div 2) 解题报告
除夕夜之有生之年CF第一场 下午从奶奶家回到姥姥家,一看还有些时间,先吃点水果陪姥姥姥爷聊了会儿,再一看表,5:20....woc已经开场20分钟了...于是抓紧时间乱搞.. **A. Guest F ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
随机推荐
- 查找mysql数据库中所有包含特定名字的字段所在的表
整个数据库查找 placement 字段: select * from INFORMATION_SCHEMA.columns where COLUMN_NAME Like '%placement%'; ...
- php下载文件的一种方式
<?php ob_start(); // $file_name="cookie.jpg"; $file_name="abc.jpg"; //用以解决中文不 ...
- 新建aix实例
http://www.cnblogs.com/kfarvid/archive/2010/12/21/1912553.html DB2数据库 http://wenku.baidu.com/view/ ...
- python 第三方库下载
C:\Python27\Scripts 路径下: easy_install.exe: C:\Python27\Scripts>easy_install.exe pycrypto pip.exe: ...
- Linux学习 -- 服务管理
1 服务分类 服务管理内容 启动 自启动 查询已安装的服务 RPM包安装的服务 自启动的 chkconfig --list 2345中如果是启用,代表下次开机会自启动 正在运行的服务 p ...
- OpenCv的Java,C++开发环境配置
1.OpenCV 下载及安装配置 opencv的下载地址:http://opencv.org/downloads.html 最新版本:opencv3.0.0 注意:支持的visual studio20 ...
- json中文乱码问题
首先在 tomcat的 D:\apache-tomcat-7.0.57\conf\server.xml里添加中文编码 <Connector port="8080" proto ...
- iptables原理详解以及功能说明
原文:http://www.svipc.com/thread-450-1-1.html 前言 iptables其实就是Linux下的一个开源的信息过滤程序,包括地址转换和信息重定向等功能的,他由四 ...
- OpenGL学习--------颜色的选择
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式.无论哪种颜色模式,计算机都必须为每一个像素保存一些数据.不同的是,RGBA模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表的是 ...
- Ubuntu下安装Hudson
因为hudson需要依赖java等,手动安装比较费劲 官方给出了一种很简单的解决方案:http://wiki.eclipse.org/Hudson-ci/Installing_Hudson_DEB 1 ...