为什么这个sort()会改变向量的值?

时间:2016-03-03 07:51:11

标签: c++11

我试图解决这个问题:https://www.hackerrank.com/challenges/board-cutting

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#define LL long long
#define M 1000000007LL
using namespace std;

int T,n,m;
LL cc;

struct Cut{
    int dir;
    LL cost;
    Cut(const int& dir, const LL& cost): dir(dir), cost(cost){}
    Cut(){}

    bool operator<(const Cut& cut) const
    {   
        return this->cost >= cut.cost;
    } 
};

vector<Cut> c;

int main() {
    cin >> T;
    while(T--){
        cin >> n >> m;
        LL ans = 0, cnt[2] = {0};
        c.clear();

        for(int i=0; i<n-1; i++) cin >> cc, c.push_back(Cut(0, cc));
        for(int i=0; i<m-1;i++) cin >> cc, c.push_back(Cut(1, cc));


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


        for(int i=0; i<c.size(); i++){
            cout << c[i].cost << endl;
        }
        cout << "END" << endl;

        for(Cut x : c){
            (ans += x.cost*(1+cnt[!x.dir]))%=M;
            cnt[x.dir]++;
        }

        cout << ans << endl;   
    }
    return 0;
}

我有这样的C ++代码,它消耗来自std I / O的输入

我添加了一个循环来输出矢量对象的cost属性。 现在进行以下输入:

2
83 99
24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
99 49
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

第二个测试用例没有成本24(只有第一个测试用例有24个) 但是如果你运行代码,你会发现vector在sort()之后包含了Cut对象,其成本为24!

为什么会发生这种情况,我该如何解决?

(以上示例输入是此问题的hackerrank官方测试用例输入,因此确保其正确性)

1 个答案:

答案 0 :(得分:3)

你的operator>有一些非常错误:

bool operator<(const Cut& cut) const
{   
    return this->cost >= cut.cost;
} 

如果两个元素相等,则返回true ,而它应返回false

尝试一下,你会找到平安(虽然反向逻辑对我来说似乎仍然很奇怪,也许在这种情况下有意义,我没有阅读问题陈述):

bool operator<(const Cut& cut) const
{   
    return this->cost > cut.cost;
} 

我觉得奇怪的另一件事是你在m-1n-1停止循环。您不想阅读mn值吗?