https://www.hackerrank.com/contests/101hack50/challenges/even-and-odd-boxes/editorial

昨晚做的时候卡了挺久的。

首先能想到的是-1的情况,奇偶性要相同,因为序列操作只是移动,所以总量是固定的。所以,如果能把它变成合法的序列。

则是偶数 + 奇数 + 偶数 + .......这样,这个序列的奇偶性就是n / 2了,要相同。

然后找出不合法的位置,假设一共有ans个,那么ans / 2就是答案。

一开始是这样想的,后来看清楚题目了,每个箱子至少要1个。

那么就要看到,奇数位置上,放了1的话,它肯定只能够是增加一个,变得合法。

所以这类又要分类出来判断。设为add个,那么有可能ans >= add,或者ans < add

ans >= add的话好办,直接是add + (ans - add) / 2

不是的话,就是需要某些合法的位置给一些去add了。很多细节,我自己的小数据

7
6
6 8 3 1 1 4
5
3 1 1 1 1
3
14 3 10
3
1 2 4
4
1 1 1 1
5
1 1 1 1 6
7
1 4 1 2 1 1 1

ans:

2
-1
0
1
-1
2
4

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 1e5 + ;
int a[maxn];
vector<int>vc, ff;
void work() {
vc.clear();
ff.clear();
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%d", a + i);
int ans = ;
LL sum = ;
int add = ;
for (int i = ; i <= n; ++i) {
sum += a[i];
if (a[i] == && (i & )) {
add++;
continue;
}
if (i & ) {
if (a[i] & ) {
ans++;
ff.push_back(a[i] - ); //存的是不合法的位置
} else if (a[i] != ) vc.push_back(a[i]);
} else {
if (!(a[i] & )) {
ans++;
ff.push_back(a[i] - ); //不合法的序列,要变成合法,先 - 1,全部去了add
} else if (a[i] != ) {
vc.push_back(a[i]);
}
}
}
int res = n / ;
if ((sum + res) & ) {
printf("-1\n");
return;
}
if (ans >= add) {
printf("%d\n", add + (ans - add) / );
} else {
int want = ans;
add -= ans;
for (int i = ; i < vc.size(); ++i) {
while (add > && vc[i] > ) {
vc[i] -= ;
add -= ;
want += ;
}
}
for (int i = ; i < ff.size(); ++i) {
while (add > && ff[i] > ) {
ff[i] -= ;
add -= ;
want += ;
}
}
if (add) {
printf("-1\n");
return;
}
printf("%d\n", want);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
cin >> t;
while (t--) work();
return ;
}

Even-odd Boxes hackerrank 分类讨论的更多相关文章

  1. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  2. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

  3. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...

  4. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil

    1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1477  Solved: 589[Submit] Descri ...

  5. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  6. 【cf789B】Masha and geometric depression(分类讨论/暴力)

    B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...

  7. P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)

    题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...

  8. UVa 11722 Joining with Friend (几何概率 + 分类讨论)

    题意:某两个人 A,B 要在一个地点见面,然后 A 到地点的时间区间是 [t1, t2],B 到地点的时间区间是 [s1, s2],他们出现的在这两个区间的每个时刻概率是相同的,并且他们约定一个到了地 ...

  9. Bzoj4558:分类讨论 计算几何 组合数学

    国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏 ...

随机推荐

  1. listen 74

    Genes Link Touch and Hearing Sound and touch may seem completely separate, except possibly when play ...

  2. ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)

    Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置 ...

  3. 【Matlab】调试基础

    1.matlab 调试子程序 在主程序进入子程序前一句加断点,然后step in,可以进入子程序. 但是直接在子程序里设置断点,运行主程序是不能进入子程序的.

  4. WPF error: does not contain a static 'Main' method suitable for an entry point

    WPF error: does not contain a static &apos;Main&apos; method suitable for an entry point doe ...

  5. JavaScript:非输入框禁用退格键

    在js文件或<javascript>标签中加入如下代码: /** *非输入框禁用退格键 */ function banBackspace(e) { var ev = e || window ...

  6. Spring boot 2.0 学习

    Spring boot 2.0出来了,支持java 9, 好多新特性,应该学习.   待续... ...

  7. Eclipse&nbsp;安装插件

    Eclipse 安装插件 本文介绍Eclipse插件的安装方法.Eclipse插件的安装方法大体有三种:直接复制.使用link文件,以及使用eclipse自带的图形界面的插件安装方法. AD: 做为当 ...

  8. map中根据value获取key

    public static String getKeyByValue(Map map, Object value) { String keys=""; Iterator it =  ...

  9. HDU 1506【单调栈】

    思路: 转化成对于某一位置为最小值求向两边最远>=他的位置,用单调栈就能轻易完成. 那么ans=(left+right)*h[i]; 维护单调递增还是递减呢? 我们能很快反应到,一旦碰到一个比他 ...

  10. -cogs1247. [Nescafé29] 穿越七色虹

    1247. [Nescafé29] 穿越七色虹 ★   输入文件:rainbow.in   输出文件:rainbow.out   简单对比时间限制:5 s   内存限制:128 MB [背景] 在Ne ...