准确来说应该是求助吧……ALGO-990,Sticks
作者:互联网
完全不理解为什么这个TLE了,nmmd
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int count1 = 0;
bool compare(int a, int b)
{
return a > b;
}
vector<int> read_in(int n, int &sum)
{
vector<int> arr;
for (int i = 0; i < n; i++)
{
int t = 0;
cin >> t;
arr.push_back(t);
sum += t;
}
sort(arr.begin(), arr.end(), compare);//返回的时候顺便排序
return arr;
}
//target为要匹配的目标棍子长度, arr就是数组, curr_need就是为了凑齐棍子所需要的长度,开始时是target
//curr_left_count为数组剩下的个数,index为下一次遍历的时候开始的索引
bool available(const int target, vector<int> arr, int curr_need, int curr_left_count, int index, int curr_compete, const int all_need_conpete)
{
//count1++;//这句话本来是用来测试函数的调用次数的,可以不要
if (curr_compete == all_need_conpete)//当目前没有可用木棍时
{
return true;
}
bool flag = false;//默认初始结果为失败
for (int i = index; i < arr.size(); i++)//对于从index开始剩下的木棍而言(这里是已经排序的,所以index之前的都不需要)
{
if (arr[i] == -1 || (i - 1 >= 0 && arr[i - 1] == arr[i]))//有两种情况不需要尝试该木棍,一种是已经被用的了,一种则是和之前的*尚未使用的*木棍一致,那么就不用搜索
{
continue;
}
if (arr[i] == curr_need)//当目前的木棍刚好能填补空缺
{
int temp = arr[i];//状态缓存
arr[i] = -1;//步入下一个状态
flag = available(target, arr, target, curr_left_count - 1, 0, curr_compete + 1, all_need_conpete);//尝试搜索
arr[i] = temp;//回退为上一个状态
break;//我猜测,因为存在有可交换的性质,这里这种“类似初态”的状态可以直接停止而不用继续搜索
//2022-3-7增加:符合要求的终态满足如下性质:可以拼成的话,那么我们抽走一部分已经拼好的,那么剩下的一样是可以拼好的。
}
else
{
if (arr[i] < curr_need)//当目前的木棍能填补一部分空缺
{
int temp = arr[i];//状态缓存
arr[i] = -1;//步入下一个状态
flag = available(target, arr, curr_need - temp, curr_left_count - 1, index + 1, curr_compete, all_need_conpete);//尝试搜索
arr[i] = temp;//回退为上一个状态
if (curr_need == target || flag)//这里有两种情况是可以跳过继续搜索的,一种是从类初态转移过来的状态,一种则是寻找到成功搜索可能的状态
{
break;
}
}
}
}
return flag;//返回结果
}
int test(vector<int> arr, int sum)
{
int max = arr[0];//获取arr的最大值,由于此前已排序
int result = sum;//这个是默认值
for (int i = max; i <= sum / 2; i++)
{
if (sum % i == 0 && available(i, arr, i, arr.size(), 0, 0, sum / i))//仅当为整除时才*有可能*成为结果,需要进一步确认
{
result = i;
break;
}
}
return result;
}
int main()
{
int n = 0;
//读入结构
while (true)
{
cin >> n;
if (n == 0)
{
break;
}
int sum = 0;
vector<int> arr = read_in(n, sum);//读入数据
cout << test(arr, sum) << endl;//输出数据
}
return 0;
}
'''
标签:index,arr,curr,Sticks,int,ALGO,target,need,990 来源: https://www.cnblogs.com/Lemon-GPU/p/15976127.html