C++ codejam问题“育儿伙伴关系”需要帮助

C++ codejam问题“育儿伙伴关系”需要帮助,c++,algorithm,C++,Algorithm,这个问题是4月4日在google codejam中提出的 问题描述如下: 卡梅隆和杰米的孩子快3岁了!然而,即使孩子现在更加独立,安排孩子的活动和家庭必需品对这对夫妇来说仍然是一个挑战 Cameron和Jamie有一个清单,上面列出了一天中要处理的N项活动。每项活动都在一天中指定的时间间隔内进行。他们需要将每个活动分配给其中一个,这样他们两个都不对重叠的两个活动负责。在时间t结束的活动不被视为与在时间t开始的另一个活动重叠 例如,假设Jamie和Cameron需要涵盖3个活动:一个从18:00到

这个问题是4月4日在google codejam中提出的

问题描述如下:

卡梅隆和杰米的孩子快3岁了!然而,即使孩子现在更加独立,安排孩子的活动和家庭必需品对这对夫妇来说仍然是一个挑战

Cameron和Jamie有一个清单,上面列出了一天中要处理的N项活动。每项活动都在一天中指定的时间间隔内进行。他们需要将每个活动分配给其中一个,这样他们两个都不对重叠的两个活动负责。在时间t结束的活动不被视为与在时间t开始的另一个活动重叠

例如,假设Jamie和Cameron需要涵盖3个活动:一个从18:00到20:00,另一个从19:00到21:00,另一个从22:00到23:00。一种可能是杰米报道从19:00到21:00的活动,卡梅隆报道其他两个。另一个有效的时间表是Cameron负责18:00到20:00的活动,Jamie负责另外两个。请注意,前两个活动在19:00和20:00之间重叠,因此不可能将这两个活动分配给同一个合作伙伴

根据每项活动的开始和结束时间,找出不要求同一个人涵盖重叠活动的时间表,或者说这是不可能的

输入 输入的第一行给出了测试用例的数量,然后是T.T测试用例。每个测试用例从一行开始,该行包含一个整数N,即要分配的活动数。然后,又有N行。从1开始计数的第i行包含两个整数Si和Ei。第i个活动在午夜后的Si分钟开始,在午夜后的Ei分钟结束

输出 对于每个测试用例,输出一行包含用例x:y,其中x是从1开始的测试用例编号,如果没有符合上述规则的有效计划,则y是不可能的,否则将输出一个正好由N个字符组成的字符串。如果第i个活动在您的计划中分配给Cameron,则y中的第i个字符必须为C;如果分配给Jamie,则y中的第i个字符必须为J

如果有多个解决方案,您可以输出其中任何一个

Input :

4
3
360 480
420 540
600 660
3
0 1440
1 3
2 4
5
99 150
1 100
100 301
2 5
150 250
2
0 720
720 1440

Output :   

Case #1: CJC
Case #2: IMPOSSIBLE
Case #3: JCCJJ
Case #4: CC
我的做法:

根据开始或结束时间对任务值进行排序,并检查是否可以将其分配给C或J。如果可以分配所有任务,则所有任务都很好,否则不可能

我尝试根据开始时间和结束时间进行排序,但两种情况下都得到了WA

如果有人能指出我在实现中缺少的东西,Qoulf将非常有帮助

我的代码:

#include<bits/stdc++.h>
using namespace std;

typedef struct task
{
    int start_time;
    int finish_time;

    task()
    {
        this->start_time=0;
        this->finish_time=0;
    }

    task(int start_time, int finish_time)
    {
        this->start_time=start_time;
        this->finish_time=finish_time;
    }

    bool operator<(const task t)
    {
        return this->start_time<t.start_time;
    }

}task;


int main()
{
    int t;
    cin>>t;

    int a=1;
    while(t--)
    {

        int n,st,ft;
        cin>>n;

        char res[1005];
        int index = 0;

        vector<task> task_list;

        for(int i=0;i<n;i++)
        {
            cin>>st>>ft;
            task t1(st,ft);
            task_list.push_back(t1);
        }

        sort(task_list.begin(),task_list.end());

        task j_task, c_task;

        for(int i=0;i<n;i++)
        {

            if(task_list[i].start_time>=j_task.finish_time)
            {
                j_task = task_list[i];
                res[index++] = 'J';     
            }
            else if(task_list[i].start_time>=c_task.finish_time)
            {
                c_task = task_list[i];
                res[index++] = 'C';     
            }
            else
            {
                index = 0;
                break;
            }

        }       

        if(index!=0)
        {
            res[index] = '\0';
            cout<<"Case #"<<a++<<": "<<res<<endl; 
        }
        else
        {
            cout<<"Case #"<<a++<<": "<<"IMPOSSIBLE"<<endl; 
        }

    }

    return 0;

}


要求您将“C”或“J”分配给输入中给定任务的原始顺序。因此,在排序之前,您应该保存任务的索引,并在排序后,将“C”或“J”分配给保存的索引。

Thank@lucieon。。。我应该正确地阅读这个问题…在哪里提到我们必须按原始顺序输出字符串。有没有提到,如果有多个解决方案,我们可以输出任何答案?。你能帮忙吗?