Codeforces Round #202 (Div. 1) A. Mafia 推公式 + 二分答案
2017-04-14 21:00
537 查看
http://codeforces.com/problemset/problem/348/A
A. Mafia
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
One day n friends gathered together to play "Mafia". During each round of the game some player must be the supervisor and other n - 1 people take part in the game. For each person we know in how many rounds he wants to be a player, not the supervisor: the i-th person wants to play ai rounds. What is the minimum number of rounds of the "Mafia" game they need to play to let each person play at least as many rounds as they want?
Input
The first line contains integer n (3 ≤ n ≤ 105). The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the i-th number in the list is the number of rounds the i-th person wants to play.
Output
In a single line print a single integer — the minimum number of game rounds the friends need to let the i-th person play at least ai rounds.
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Examples
Input
Output
Input
Output
Note
You don't need to know the rules of "Mafia" to solve this problem. If you're curious, it's a game Russia got from the Soviet times: http://en.wikipedia.org/wiki/Mafia_(party_game).
这题用了组合数学的表示方法,这个方法经常用而且很好用,其实就是设未知数。
设x[i]表示第i个人,做了多少次裁判,那么ans = sigma(x[i])
对于第i个人,它参赛了ans - x[i]次,那么需要
ans - x[1] >= a[1]
ans - x[2] >= a[2]
ans - x[3] >= a[3]
.....
ans - x
>= a
求和,得到(n - 1) * ans >= sum(a[i])
二分ans即可,
注意ans要大于等于max(a[i])
View Code
A. Mafia
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
One day n friends gathered together to play "Mafia". During each round of the game some player must be the supervisor and other n - 1 people take part in the game. For each person we know in how many rounds he wants to be a player, not the supervisor: the i-th person wants to play ai rounds. What is the minimum number of rounds of the "Mafia" game they need to play to let each person play at least as many rounds as they want?
Input
The first line contains integer n (3 ≤ n ≤ 105). The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the i-th number in the list is the number of rounds the i-th person wants to play.
Output
In a single line print a single integer — the minimum number of game rounds the friends need to let the i-th person play at least ai rounds.
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Examples
Input
3 3 2 2
Output
4
Input
4 2 2 2 2
Output
3
Note
You don't need to know the rules of "Mafia" to solve this problem. If you're curious, it's a game Russia got from the Soviet times: http://en.wikipedia.org/wiki/Mafia_(party_game).
这题用了组合数学的表示方法,这个方法经常用而且很好用,其实就是设未知数。
设x[i]表示第i个人,做了多少次裁判,那么ans = sigma(x[i])
对于第i个人,它参赛了ans - x[i]次,那么需要
ans - x[1] >= a[1]
ans - x[2] >= a[2]
ans - x[3] >= a[3]
.....
ans - x
>= a
求和,得到(n - 1) * ans >= sum(a[i])
二分ans即可,
注意ans要大于等于max(a[i])
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <assert.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> const int maxn = 1e5 + 20; LL a[maxn], sum; LL mx; int n; bool check(LL ans) { return ans >= (LL)ceil(1.0 * sum / (n - 1)) && ans >= mx; } void work() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; sum += a[i]; mx = max(mx, a[i]); } LL be = 1, en = 1e18L; while (be <= en) { LL mid = (be + en) >> 1; if (check(mid)) { en = mid - 1; } else be = mid + 1; } cout << be << endl; } int main() { #ifdef local freopen("data.txt", "r", stdin); // freopen("data.txt", "w", stdout); #endif IOS; work(); return 0; }
View Code
相关文章推荐
- 【Codeforces Round 364 (Div 2)D】【二分答案 or 公式推导】As Fast As Possible 小朋友乘校车去远足最短到达时间
- Codeforces Round #202 (Div. 1) A. Mafia二分查找,玩游戏
- Codeforces Round #202 (Div. 1) A. Mafia(二分,思路)
- Codeforces Round #202 (Div. 1) A. Mafia 【二分】
- 【Codeforces Round 330 (Div 2)D】【计算几何 二分答案】Max and Bike 最小骑车距离使得圆上传感器很坐标位移为dis
- Codeforces Round #202 (Div. 1) A. Mafia
- Codeforces Round #202 (Div. 2) C. Mafia
- Codeforces Round #202 (Div. 2)C. Mafia(思维)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
- Codeforces Round #202 (Div. 1) A. Mafia 贪心
- D. One-Dimensional Battle Ships-二分答案-Codeforces Round #Pi (Div. 2)
- Codeforces Round #202 (Div. 2)C. Mafia
- Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)
- Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论
- Codeforces Round #202 (Div. 1) A. Mafia
- (二分)Codeforces Round #415 (Div. 2) D-Glad to see you!
- Codeforces Round #275 (Div. 2) B. Friends and Presents 二分+数学
- Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
- Codeforces Round #354 (Div. 2) C (二分???)
- Codeforces Round #298 (Div. 2) D. Handshakes 二分