Codeforces 671B Robin Hood (二分搜索)
2017-01-18 16:05
375 查看
题意:
给定一个数列,每次让最大值-1,最小值+1,问你k次操作之后,数列中的最大值和最小值的差值是多少。
解法:
不管结果是怎样的,我们可以确定的是,最后的最大值和最小值肯定是固定的,但是我们不能确定到底是多少,所以我们需要尝试,而且随着操作次数的增加,最大值会越来越小,最小值会越来越大,所以我们采用二分搜索来找最后的值。值得注意的是,寻找最大值和最小值的边界是不一样的,具体在代码中。
代码:
给定一个数列,每次让最大值-1,最小值+1,问你k次操作之后,数列中的最大值和最小值的差值是多少。
解法:
不管结果是怎样的,我们可以确定的是,最后的最大值和最小值肯定是固定的,但是我们不能确定到底是多少,所以我们需要尝试,而且随着操作次数的增加,最大值会越来越小,最小值会越来越大,所以我们采用二分搜索来找最后的值。值得注意的是,寻找最大值和最小值的边界是不一样的,具体在代码中。
代码:
// Created by CQU_CST_WuErli // Copyright (c) 2016 CQU_CST_WuErli. All rights reserved. // //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <string> #include <vector> #include <map> #include <queue> #include <stack> #include <set> #include <algorithm> #include <sstream> #define CLR(x) memset(x,0,sizeof(x)) #define OFF(x) memset(x,-1,sizeof(x)) #define MEM(x,a) memset((x),(a),sizeof(x)) #define BUG cout << "I am here" << endl #define lookln(x) cout << #x << "=" << x << endl #define SI(a) scanf("%d", &a) #define SII(a,b) scanf("%d%d", &a, &b) #define SIII(a,b,c) scanf("%d%d%d", &a, &b, &c) const int INF_INT=0x3f3f3f3f; const long long INF_LL=0x7f7f7f7f; const int MOD=1e9+7; const double eps=1e-10; const double pi=acos(-1); typedef long long ll; using namespace std; ll n, k; ll c[500050]; int main(int argc, char const *argv[]) { #ifdef LOCAL freopen("C:\\Users\\john\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\john\\Desktop\\out.txt","w",stdout); #endif while (scanf("%I64d%I64d", &n, &k) == 2) { ll sum = 0; for (int i = 1; i <= n; i++) { scanf("%I64d", c + i); sum += c[i]; } ll L = 0, R = sum / n; ll ans1 = 0; while (L <= R) { ll mid = L + R >> 1; ll tmp = 0; for (int i = 1; i <= n; i++) if (c[i] < mid) tmp += mid - c[i]; if (tmp <= k) ans1 = mid, L = mid + 1; else R = mid - 1; } L = (sum + n - 1) / n, R = 1000000000; ll ans2 = 0; while (L <= R) { ll mid = L + R >> 1; ll tmp = 0; for (int i = 1; i <= n; i++) if (c[i] > mid) tmp += c[i] - mid; if (tmp <= k) ans2 = mid, R = mid - 1; else L = mid + 1; } cout << ans2 - ans1 << endl; } return 0; }
相关文章推荐
- Codeforces-231C-To Add or Not to Add(二分搜索)
- Codeforces 484B. Maximum Value(高效二分搜索)
- codeforces 732D Exams 二分搜索 贪心
- CodeForces - 287B Pipeline 二分搜索
- Codeforces 782B 二分搜索
- Codeforces 671B Robin Hood 二分答案
- CodeForces - 924B Three-level Laser (二分搜索)
- codeforces 671B Robin Hood 二分
- Codeforces 887E Little Brothers 过两点的圆和给定的圆的关系 二分搜索
- CodeForces-768B Code for 1 二分搜索线段
- CodeForces 371C-Hamburgers(二分搜索)
- codeforces 776C Molly's Chemicals(前缀和 二分搜索)
- codeforces 778D. String Game (二分搜索)
- codeforces 785 C. Anton and Fairy Tale (数学 二分搜索)
- 【1】【二分搜索】CodeForces 492D Vanya and Computer Game
- CodeForces 716B Complete The Graph(二分搜索)(最短路)
- codeforces 932D Tree 倍增法+二分搜索
- CodeForces 671B Robin Hood (二分)
- codeforces 895B. XK Segments (二分搜索)
- 【1】【二分搜索】CodeForces 650B Image Preview