大家快来A这道题 (map练习,map里不止映射两个数)

Problem Description

给你n个人,每个人都有一个彩票,每个彩票有3个号码,一共会开m次奖,每次开奖会会随机开出两个随机位置的号码,如果有一张彩票和开奖的彩票在相同位置上的号码是一样的,那么被视为中奖,不管其他位置的数字是多少。求中奖次数最多的人,如果中奖次数一样多的人有多个,取编号最小的人。
Input

第一行输入n,m(1<= n,m <=2e5 )

下面 n 行,每行3个数字ai,bi,ci(1<=ai,bi,ci<=1e9)表示第i个人,编号从1开始。三个位置的号码。

下面 m 行,每行四个数字aj,bj,cj,dj,(1<=aj,cj<=3,1<=bj,dj<=1e9)第一个号码数的位置,彩票号码数,第二个号码数的位置,彩票号码数。
Output

输出一个整数为中奖次数最多的人的号码数,如果有多个最多中奖次数相同的人,输出编号最小的。
Sample Input

2 2
1 1 1
1 1 2
1 1 2 1
2 1 3 2

Sample Output

2

Hint

如果某次开奖是2 1 3 2,那么所有号码为(x,1,2)(x可以是任何数),都被视为中奖。

正常的map是里面两个变量比如map<int, string> ma。 如何存好几个,比如
 

map< pair<int, int>, int> ma1;

或者
struct node{ int x, int y};
map<node, string> ma2;
还有我之前博客提到的map<int, map<int, int>空格> ma3;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200005], b[200005], c[200005];
int main()
{
    map<pair<int, int>, int> ma12;
    map<pair<int, int>, int> ma13;
    map<pair<int, int>, int> ma23;
    int m, n;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        scanf("%d %d %d",&a[i], &b[i], &c[i]);
    int ai, bi, ci, di;
    pair<int, int> p1;
    while(m--)
    {
        scanf("%d %d %d %d", &ai, &bi, &ci, &di);
        if(ai > ci)
        {
        swap(ai, ci);
        swap(bi, di);
        }
        if(ai == 1 && ci == 2)
        {
            p1 = make_pair(bi, di);
            ma12[p1]++;
        }
        else if(ai == 1 && ci == 3)
        {
            p1 = make_pair(bi, di);
            ma13[p1]++;
        }
        else if(ai == 2 && ci == 3)
        {
            p1 = make_pair(bi, di);
            ma23[p1]++;
        }
    }
    int k = 0;
    int max = -1;   
    pair<int, int> p2;
    pair<int, int> p3;
    for(int i = 1; i <= n; i++)
    {
        p1 = make_pair(a[i], b[i]);
        p2 = make_pair(a[i], c[i]);
        p3 = make_pair(b[i], c[i]);
        if(ma12[p1] + ma13[p2] + ma23[p3] > max)
        {           如果没有一个人中奖,都是零次,就输出序列最小的也就是1。i=1时就让k=1了。
            max = ma12[p1] + ma13[p2] + ma23[p3];
            k = i;
        }
    }
    cout << k << endl;
    return 0;
}

给个ma3的用法代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200005], b[200005], c[200005];
int main()
{
    map<int, map<int, int> > ma12;
    map<int, map<int, int> > ma13;
    map<int, map<int, int> > ma23;
    int m, n;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        scanf("%d %d %d",&a[i], &b[i], &c[i]);
    int ai, bi, ci, di;
    pair<int, int> p1;
    while(m--)
    {
        scanf("%d %d %d %d", &ai, &bi, &ci, &di);
        if(ai > ci)
        {
        swap(ai, ci);
        swap(bi, di);
        }
        if(ai == 1 && ci == 2)
        {
            ma12[bi][di]++;
        }
        else if(ai == 1 && ci == 3)
        {
            ma13[bi][di]++;
        }
        else if(ai == 2 && ci == 3)
        {
            ma23[bi][di]++;
        }
    }
    int k = 0;
    int max = -1;
    for(int i = 1; i <= n; i++)
    {
        if(ma12[a[i]][b[i]] + ma13[a[i]][c[i]] + ma23[b[i]][c[i]] > max)
        {
            max = ma12[a[i]][b[i]] + ma13[a[i]][c[i]] + ma23[b[i]][c[i]];
            k = i;
        }
    }
    cout << k << endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值