MVP争夺战
知识点DFS搜索
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP。
MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都相同。
然而比赛过程中的每一分钟的得分都只能由某一个人包揽。
输入描述:
输入第一行为一个数字t,表示有得分的分钟数( 1 <= t <= 50),第二行为t个数字,代表每一分钟的得分p(1 <= p <= 50)
输出描述:
输出有得分的队员都是MVP时最少的MVP得分。
示例1
输入:
9
5 2 1 5 2 1 5 2 1
输出:
6
说明:
样例解释:一共4人得分,分别都为6分
5 + 1
5 + 1
5 + 1
2 + 2 + 2
解题思路:
和力扣 698很像
#include<bits/stdc++.h>
using namespace std;
vector<int> bucket;
bool backtrack(vector<int> &nums, int index, int target);
int main()
{
int t;
cin >> t;
vector<int> nums;
int sum = 0;
int tmp;
while(cin >> tmp) {
sum += tmp;
nums.push_back(tmp);
if(cin.get() == '\n') {
break;
}
}
cout << sum << ' ' << t << endl;
//输入的时候计算和或者用函数求和
// sum = accumulate(nums.begin(),nums.end());
sort(nums.rbegin(), nums.rend());
for(int k = t; k > 0; k--) {
cout << k << endl;
if(sum%k == 0) {
bucket.resize(k);
int target = sum/k;
bool result = backtrack(nums, 0, target);
if(result) {
cout << target << endl;
return 0;
}
}
}
return 0;
}
bool backtrack(vector<int> &nums, int index, int target) {
if(index == nums.size()){
return true;
}
for(int i = 0; i < bucket.size(); i++) {
if(bucket[i] + nums[index] > target) {
continue;
}
if(i > 0 && bucket[i] == bucket[i-1]) {
continue;
}
bucket[i] += nums[index];
if(backtrack(nums, index+1, target)) {
return true;
}
bucket[i] -= nums[index];
}
return false;
}