/*
题意大概就是减去x,再减去十分之一,找到最小能减去的那个数。
这有什么呀.. 首先担心会不会超了,写个小的先算一下,哪怕是1e18也只最多除三百次就除没了,二分是nlogn的,用起来应该没什么问题。然后开始写……错的很绝望,打开了花语学院……(划掉)
【端点,端点,端点】(很严重!)
(本场中的A,wa了一次其实应该注意到也是有端点的问题,每个都取到端点实验一次,是最起码的尊重……)
那么问题出在哪里呢:
(1)1e18的时候超时,其实是int mid这里溢出了所以没给出答案来。
(2)1的时候答案是1程序给出0,别把1特判了…… 试试更大的,果然,2、8、16这种都会报0。
问题出在二分过程中,因为要求是整数,最小的时候可以取到0和1,验证1可行之后mid变为0,0自然可行(68这么大的数据给出的答案依然还只是3,中间会有很多balaala。。)
所以cal计算里面应该特判0为false
(3)二分程序的问题。抽特王模板中,是前面可行后面不可行,此题显然是后面可行前面不可行(0 是个例外应该排除)
(4)就像除法会有精度损失,更多时候应该以乘法替代,这个题中n/2 在n=43 44时也要.. 反正改了就过了...
43/2=21.5 会约成21 cal中返回21会误判为对(其实应该n+1再除吧,这样43就要大于22才行,44也是大于22,我是直接加了奇偶判断)
(5)一些小毛笔,如数学表达式中temp = temp - ans-((temp - ans) / 10)
【最好能草稿纸和写的完全了再代入吧。。】
以及,n是在程序中进行操作的,所以先设置一个temp代替n进行损耗运算。
所以啊啊遇到问题的时候不要先想特殊,改个数据就完了,要仔细想想啊
所以这起码证明了,我不是个傻子……(也差不多了)
“不,我不是想说这个…… 是本来,一个问题就可以有很多种解法”
做好一个题是多么的不容易啊…… (D待补充)
D题呢就是,能否组成旋转四个角度的L型。
我用了一种很投机的方法…… 随便想想的,竟然还过了
大概需要一点灵性吧……把X转化成1,0转化成0,相加为1则都用掉,跳过2个,为0则用掉一个,跳过一个并修改为1 ,后面是什么不重要只要和是1就可以组成。其他情况跳过1。题目太简单了……只有两行,还是横着的
很开心,想改的更短点,结果又不过了……
后来想明白,修改之后的是在每次读入之后进行操作,所以上面的直接跳过两个方法不适用。
所以别画虎不成反类犬呀,实现了就好。在某种程度上
18-7-9
*/
C题
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n;
bool cal(ll ans) {
if(ans ==0) return false;
ll cnt = 0;
ll temp = n;
while ((temp - ans)>=10) {
temp = temp - ans-((temp - ans) / 10);
cnt++;
}
if (n % 2 == 0)
return ((n / 2) <= (temp + cnt * ans));// return true;
else return (((n+1) / 2) <= (temp + cnt * ans));
}
int main() {
while (cin >> n) {
ll l = 0; ll r;// = n;
if(n>10)
r = n / 10 + 1;
else r = n;
ll ans = 0;
while (l <= r) {
ll mid = (l + r) / 2;
if (cal(mid) == true)
{
r = mid - 1;
ans = mid;
}
else l = mid + 1;
}
cout <<ans<< endl;
}
return 0;
}
D题 上面是AC了的
#include<iostream>
#include<string>
using namespace std;
int a[105];
int b[105];
int main() {
string a1, b1; while (cin >> a1 >> b1) {
int n = a1.length();
for (int i = 0; i <= n - 1; i++) {
if (a1[i] == 'X') a[i] = 1; else a[i] = 0;
if (b1[i] == 'X')b[i] = 1; else b[i] = 0;
}int cnt = 0;
for (int i = 1; i < n; i++)
{
if (a[i - 1] + a[i] + b[i] + b[i - 1] == 1) { i++; cnt++; }
else if (a[i - 1] + a[i] + b[i] + b[i - 1] == 0) { a[i] = 1; cnt++; }
}
cout << cnt << endl;
}
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int a[105];
int b[105];
int main() {
string a1, b1;
while (cin >> a1 >> b1) {
int n = a1.length();
if (a1[0] == 'X') a[0] = 1; else a[0] = 0;
if (b1[0] == 'X')b[0] = 1; else b[0] = 0;
int cnt = 0;
for (int i = 1; i <= n - 1; i++) {
if (a1[i] == 'X') a[i] = 1; else a[i] = 0;
if (b1[i] == 'X')b[i] = 1; else b[i] = 0;
if (a[i - 1] + a[i] + b[i] + b[i - 1] == 1) { i++; cnt++; }
else if (a[i - 1] + a[i] + b[i] + b[i - 1] == 0) { a[i] = 1; cnt++; }
}
cout << cnt << endl;
}
return 0;
}
下面这个岂不是length更长了。。。。想什么呢。。别做梦了 a就可以了_(:з」∠)_