ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

准确来说应该是求助吧……ALGO-990,Sticks

2022-03-07 15:31:06  阅读:168  来源: 互联网

标签:index arr curr Sticks int ALGO target need 990


完全不理解为什么这个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有