Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 找不到角盒I';我在最近遇到的一个问题中失踪了_C++_Arrays_Sorting_Vector_Std Pair - Fatal编程技术网

C++ 找不到角盒I';我在最近遇到的一个问题中失踪了

C++ 找不到角盒I';我在最近遇到的一个问题中失踪了,c++,arrays,sorting,vector,std-pair,C++,Arrays,Sorting,Vector,Std Pair,在昨天的CodeChef竞赛中,我遇到了一个问题,在这个问题中,我能够编写能够解决所有“正常”测试用例的代码,但是,当涉及到一个我似乎错过的可能的关键用例时,它失败了 问题如下:- Chef医生正在治疗新冠病毒19型患者。在他的诊所外面有一个由N名患者组成的队列(编号从队列前面的患者1到后面的患者N)。你,他的助手,发现每一个有效的i,第i个病人都有一个疾病等级Ai 厨师根据患者的健康状况对患者进行治疗,也就是说,在治疗任何病情较低的患者之前,总是先治疗病情较高的患者。Chef也是公平的,因此他

在昨天的CodeChef竞赛中,我遇到了一个问题,在这个问题中,我能够编写能够解决所有“正常”测试用例的代码,但是,当涉及到一个我似乎错过的可能的关键用例时,它失败了

问题如下:-

Chef医生正在治疗新冠病毒19型患者。在他的诊所外面有一个由N名患者组成的队列(编号从队列前面的患者1到后面的患者N)。你,他的助手,发现每一个有效的i,第i个病人都有一个疾病等级Ai

厨师根据患者的健康状况对患者进行治疗,也就是说,在治疗任何病情较低的患者之前,总是先治疗病情较高的患者。Chef也是公平的,因此他根据患者在队列中的位置对其进行同等疾病级别的治疗,即队列中前面的患者总是在队列中后面的具有相同疾病级别的患者之前进行治疗

第一个接受治疗的病人必须等一个小时,厨师才能安装他的设备。治疗每个病人也需要一个小时,厨师总是在治疗完下一个病人后立即开始治疗下一个病人

病人有点不耐烦。作为厨师长助理,了解每位患者在厨师开始治疗该患者之前需要等待多长时间(小时)

输入

输入的第一行包含一个表示测试用例数量的整数T。T测试用例的描述如下

每个测试用例的第一行包含一个整数N

第二行包含N个空格分隔的整数A1、A2、…、AN

输出

对于每个测试用例,打印一行包含N个空格分隔的整数。对于每个有效i,这些整数中的第i个应为第i个患者需要等待的时间

约束条件

一,≤T≤五,

一,≤N≤105

一,≤艾岛≤每一个有效的i

示例输入

四,

五,

2 3 5 3 4

三,

2 2

六,

210330210

四,

89899

示例输出

531412

1 2 3

513462

3 1 4 2

解释

例1:3号患者的病情级别最高。因此,这位患者只需等待一个小时,厨师就可以安装他的设备,然后立即接受治疗。第5号患者的病情级别次高,因此他们排在第二位。他们需要等待一个小时,等待患者3接受治疗。患者5总共需要等待2小时。之后,患者2和4的病情级别相同,但患者2在队列中领先,因此患者2排在第二位,接着是患者4,最后是患者1

示例案例2:所有三名患者的病情等级相同,因此根据他们在队列中的位置进行治疗。首先是患者1,然后是患者2,然后是患者3

示例案例3:队列中第2位和第6位的患者的疾病级别最高为10。位置2的患者排在队列的前面,因此首先治疗该患者,然后治疗位置6的患者。在此之后,队列中第3位和第4位的患者的疾病级别次高,因此第3位的患者接下来接受治疗,第4位的患者随后接受治疗。类似地,之后,治疗位置1处的患者,然后治疗位置5处的患者

示例案例4:队列中第2位和第4位的患者具有最高的疾病级别9,因此首先治疗第2位的患者,然后是第4位的患者,然后是第1位的患者,最后是第3位的患者

方法

我将元素Ai和索引I存储在成对的向量中,然后根据Ai对向量进行排序,以便能够以排序的方式一起访问最高级别的疾病。然后,我开始从[1,1000]范围内给定Ai的第一个元素开始按降序分配小时数(先治疗高阶疾病)。我想出了以下代码:-

#include <bits/stdc++.h>
typedef unsigned long long int intl;
using namespace std;

bool icompare(pair<intl, intl> p1, pair<intl, intl> p2) //function to compare first elements of the pairs
{
    return (p1.first < p2.first);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    intl t; //no. of testcases
    cin >> t;
    while (t--)
    {
        intl n;
        cin >> n;
        intl arr[n], ans[n], ctr[1000] = {0}; //arr stores Ai, ans stores no. of hours i'th 
patient has to wait for and ctr[1000] keeps count of number of occurrences of each Ai

        vector<pair<intl, intl>> v; //vector of pairs to store Ai paired with its index in original array
        for (intl i = 0; i < n; i++)
        {
            cin >> arr[i];
            v.push_back(make_pair(arr[i], i)); //making of vector of pairs 
            ctr[arr[i] - 1]++;    //counting occurrences of each Ai (0 base indexing)
        }

        sort(v.begin(), v.end(), icompare);  //sorting first (arr[n]) elements of the vector

        intl a = 0, hours = 1; // a is used to find out indices of occurences of the same Ai with the help of the array ctr[1000] and hours keeps count of number of patients

        for (intl i = 1000; i > 0; i--)
        {
            if (hours == n + 1) // base case
            {
                break;
            }

            intl idxprev = n - a;  // index where (i + 1) started
            a += ctr[i - 1]; // updating a for i
            intl idx = n - a; // index where i starts

            if (idxprev == idx) // if there is no Ai for the number
            {
                continue;
            }

            for (intl j = idx; j < idxprev; j++)
            {
                ans[v[j].second] = hours; // accessing original index of Ai for N patients with the 
help of second element of the pair
                hours++; 
            }
        }
        for (intl i = 0; i < n; i++)
        {
            cout << ans[i] << " "; // printing the hours for each patient
        }
        cout << endl;
    }
    return 0;
}
#包括
typedef无符号长整型整数;
使用名称空间std;
bool icompare(对p1,对p2)//用于比较对的第一个元素的函数
{
返回(p1.first>t;
而(t--)
{
国际n;
cin>>n;
intl arr[n],ans[n],ctr[1000]={0};//arr存储Ai,ans存储i'th的小时数
患者必须等待,ctr[1000]记录每个Ai的发生次数
向量v;//在原始数组中存储与其索引成对的Ai的对向量
对于(intl i=0;i>arr[i];
v、 向后推(生成向量对(arr[i],i));//生成向量对
ctr[arr[i]-1]++;//计算每个Ai的出现次数(0个基本索引)
}
排序(v.begin(),v.end(),icompare);//对向量的第一个(arr[n])元素进行排序
intl a=0,hours=1;//a在数组ctr[1000]的帮助下用于找出同一Ai的发生指数,hours记录患者数量
对于(intl i=1000;i>0;i--)
{
if(hours==n+1)//基本情况
{
打破
}
intl idxprev=n-a;//索引(i+1)从何处开始
a+=ctr[i-1];//为i更新a
intl idx=n-a;//索引从何处开始
if(idxprev==idx)//如果该数字没有Ai
{
继续;
}
对于(intl j=idx;j