其他分享
首页 > 其他分享> > 准确来说应该是求助吧……ALGO-990,Sticks

准确来说应该是求助吧……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