2016-03-03 69 views
1

我試圖解決這個問題: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

我添加了一個環,以輸出矢量對象成本屬性消耗輸入。 現在以下輸入:

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個) 但是,如果你運行代碼,你會發現,載體含有切割對象在排序之後花費24()!

爲什麼會發生這種情況,我該如何解決?

(以上樣品輸入針對此問題hackerrank正式測試用例輸入,所以它的正確性是有保證的)

+0

你應該更好地描述你的問題。也許嘗試更簡單的測試集?使用調試器來驗證輸入和輸出。什麼是輸入,輸出什麼? – JeffRSon

+0

@JeffRSon已編輯包含問題鏈接,我試着減少n,m,但不能再現同一問題:( – shole

回答

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的值嗎?

+0

謝謝!對於m-1/n-1值,請閱讀問題說明:) 你能解釋爲什麼> =錯了嗎?即使我試圖在兩個值相等時交換兩個值,但它不穩定,但它爲什麼會改變向量的值? – shole

+0

@shole這不是它的工作原理。 'sort'是爲寫入正確的比較器而寫的。如果你告訴它與一個寫得不好的比較器一起工作,那個比較器不符合標準的要求(包括一個項目永遠不會小於或大於它自己的項目),那麼就沒有安全網,不能保證你找回原來的項目以某種未指定的順序。 – hvd

+0

@ hvd它仍然讓我感到困惑,但比以前更容易混淆......謝謝。 (我通常只是跳過所有常量,在網上比賽,有時它有時它不會,仍然不知道爲什麼) – shole

相關問題