L2-009 抢红包 (25分)

用了一些奇妙的方法 注释比较详细

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <tuple>
const int MAX_N = 1e4 + 5;
using namespace std;
int main()
{
    /*
    v[0] = {1,2,3};
    get可以取出tuple的元素 
    get<i>取出第i个元素
    get<0>(v[0]) = 1;
    cout << get<0>(v[0]);
    */
    int N;
    cin >> N;
    //id 是第一个 money 是第二个 cnt 是第三个
    vector<tuple<int, int, int>> v(N + 1);

    for (int i = 1; i <= N; i++)
    {
        int m;
        cin >> m;
        get<0>(v[i]) = i;
        int flag[MAX_N] = {0};
        while (m--)
        {
            int id, money;
            cin >> id >> money;
			//看是不是有人想抢两次 
            if (flag[id] == 1)
                continue;
			//抢的人加钱
            get<1>(v[id]) += money;
			//发红包的人减钱
            get<1>(v[i]) -= money;
			//抢的次数增加
            get<2>(v[id])++;
			//标记
            flag[id] = 1;
        }
    }
    auto cmp = [](tuple<int, int, int> &e1, tuple<int, int, int> e2) {
        //把小于号定住
		//递增 让第一个在前面
		//递减 让第二个在前面
        return tie(get<1>(e2), get<2>(e2), get<0>(e1)) < tie(get<1>(e1), get<2>(e1), get<0>(e2));
    };
    sort(v.begin(), v.end(), cmp);
    for (int i = 0; i <= N; ++i)
    {
        if (get<0>(v[i]) == 0)
            continue;
        cout << get<0>(v[i]) << ' ' << fixed << setprecision(2) << 1.0 * get<1>(v[i]) / 100 << endl;
    }
    return 0;
}
发布了116 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45653525/article/details/104703359