1.トピック
ゲームをプレイしてN人、審判があり、それぞれのゲーム、およびN-1民間人の選手。少なくとも、選手を代表して、配列A、A [i]は、私がA文民でなければならない与えられた[i]は二回に戻ります最小回数のゲーム。
样例 1:
输入:A = [2, 2, 2, 2]
输出:3
解析:
A[0] = 2表示玩家0至少需要成为2次平民
第一局:玩家0担任裁判,此时 A[0] = 0, A[1] = 1, A[2] = 1, A[3] =1
第二局:玩家1担任裁判,此时 A[0] = 1, A[1] = 1, A[2] = 2, A[3] = 2
第三局:玩家2担任裁判,此时 A[0] = 2, A[1] = 2, A[2] = 2, A[3] = 3
此时每个玩家都达到了要求,所以进行三局游戏即可
样例 2:
输入:A = [84,53]
输出:137
解析:
第一局:玩家1担任裁判 ,此时 A[0] = 1, A[1] = 0
......
第三十一局:玩家1担任裁判,此时 A[0] = 31, A[1] = 0
第三十二局:玩家0担任裁判,此时 A[1] = 31, A[1] = 1
第三十三局:玩家1担任裁判,此时 A[1] = 32, A[1] = 1
第三十四局:玩家0担任裁判,此时 A[1] = 32, A[1] = 2
......
第一百三十七局:玩家1担任裁判,此时 A[1] = 84, A[1] = 53
此时每个玩家都达到了要求,所以进行一百三十七局游戏即可
注意事项
∑Ai <= 1e18
1 < n < 1000
2.問題解決
- アイデアは、とき審判は、他の人、その人の少なくとも数を向けることである-1
- 次いで、再順序付けプロセスが繰り返され、アナログ、デジタルデータは非常に大きく、時間外であります
- ご注文の前に、最大の人々に加えて
MAX
、他の人が減算され、MAX
- これらの人々の前のN-1と(負の数、数は審判することができます)
- この数> MAXは、直接(審判の回数)の絶対値場合
MAX
回ゲームオーバーであります - それ以外の場合は、審判十分な頻度で、必要が/の数を補うために、N-1個人が平等に共有します
class Solution {
public:
long long playGames(vector<int> &A) {
// Write your code here
sort(A.begin(),A.end());
int n = A.size();
int MAX = A[n-1];
long long sum= 0;
for(int i = 0; i < n-1; ++i)
{
A[i] -= MAX;
sum += A[i];
}
if(sum + MAX <= 0)
return MAX;
else
return ceil((sum+MAX)/double(n-1))+MAX;
}
};
試験データの100%
総時間50ミリ秒
、あなたの提出は、54.05パーセントの提出を破りました!
class Solution { //超时,模拟代码
public:
long long playGames(vector<int> &A) {
// Write your code here
int n = A.size(), i, c;
if(n == 2)
return A[0]+A[1];
long long sum = 0;
sort(A.begin(),A.end());
while(A[0] > 0)
{
i= n-2;
while(i >= 2 && A[n-1] == A[i])
i--;
c = A[n-1]-A[i];
if(c==0)
c = 1;
sum += c;
for(i = n-1; i >= 1; i--)
A[i] -= c;
sort(A.begin(),A.end());
}
if(A[n-1] > 0)
sum += A[n-1];
return sum;
}
};