0

私は次のことをしなければならないオンラインチャレンジをしています。

村で行われるコンテストがあります。そのため、最初の行に 2 つの数字 N (コンテストに参加する人数) と K (何人がステージ 2 に進むことができるか) を入力します。

その後、両方の段階で各候補者に N 倍の票を入力します。

入力例:

5 3
9 2
3 10
5 6
8 4
6 5

ご覧のとおり、 , を入力N=5しますK=3。これは 5 つの候補を意味するため、追加の 5 行とそのうちの 3 行がステージ 2 に進みます。

配列を並べ替えた後、最も多くの票を獲得した候補者は、6、8、および 9 の候補者です。したがって、彼らはステージ 2 に進みます。勝者は、ステージ 2 で最も多くの票を獲得した候補者です。この場合、6 は 5 票で最多 (8 は 4 票、9 は 2 票) であるため、6 のインデックスである 5 を出力します。

私がこれまでに得たもの:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int arr[50],nizabackup[50],n,k,niza2[50],saveindex[50],indexp=0;
    cin >> n >> k;
    for(int i=0;i<n;i++)
    {
        cin >> arr[i] >> niza2[i];
        nizabackup[i] = arr[i];
    }
    sort(arr,arr+n);
    for(int j=n;j>=k;j--)
    {
        for(int k=0;k<n;k++)
        {
            if(arr[j]==nizabackup[k])
            {
                saveindex[0]=k;
                indexp++;
            }
        }
    }
    sort(saveindex,saveindex+indexp);
    cout << saveindex[indexp];
    return 0;
}

何をすべきかのヒントと、追加の質問が必要です-デバッガーが 2 番目の for ループを読み取らないのはなぜですか?

4

1 に答える 1

3

OK、代替実装。より多くのセットアップがありますが、main最初に読んで、実際のロジックがどれほど単純かを確認してください。

#include <vector>
#include <iostream>
#include <algorithm>

struct Contestant {
    int index;
    int firstVote;
    int secondVote;
    Contestant(int i, int v1, int v2) : index(i), firstVote(v1), secondVote(v2)
    {}
};
// return true if l should come before r in sorted result
bool byFirstVote(Contestant const &l, Contestant const &r) {
    return l.firstVote > r.firstVote; // sort by first vote
}
bool bySecondVote(Contestant const &l, Contestant const &r) {
    return l.secondVote > r.secondVote; // sort by second vote
}

int main()
{
    int n, k;
    std::cin >> n >> k;
    // populate a single vector of {index, firstVote, secondVote}
    std::vector<Contestant> contestants;
    for(int i=0; i<n; i++) {
        int v1, v2;
        std::cin >> v1 >> v2;
        contestants.push_back(Contestant(i+1, v1, v2));
    }
    // sort all by firstVote, then sort first k by secondVote
    std::sort(contestants.begin(), contestants.end(), byFirstVote);
    std::sort(contestants.begin(), contestants.begin()+k, bySecondVote);
    std::cout << contestants.front().index << std::endl;
}

インデックス(例のように、ゼロではなく1から開始)と両方の投票をすべて1つの構造にまとめて保存しています。

次に、並べ替えるフィールドを変更するだけです。

于 2013-03-28T12:56:44.720 に答える