题目描述
小B来到了一个村庄,村庄里有 \(N\) 个村民,第 \(i\) 个村民会售卖 \(ai\) 种物品,在他所售卖的所有物品中,第 \(j\) 个物品的编号是 \(sj\) ,价格是 \(pj\) 颗绿宝石,数量是 \(bj\) 。现在小B想要购买 \(M\) 种物品,第 \(i\) 种物品编号是 \(ci\) 。因为他想要购买的这些物品都是他紧缺的,所以当任何一个村民售卖这个物品时,他就会全部购买。小B想知道,他需要准备多少颗绿宝石。
输入格式
第一行输入两个整数 \(N\) 和 \(M\)
接下来,输入 \(N\) 组数据
第 \(i\) 组的第一行输入 \(ai\)
第 \(i\) 组的接下来 \(ai\) 行,第 \(j\) 行输入 \(3\) 个整数 \(sj\) , \(pj\) , \(bj\)
接下来 \(M\) 行,第 \(i\) 行输入 \(ci\)
输出格式
一个整数,表示小B需要准备的绿宝石数
样例输入
2 1
2
3 4 1
2 1 7
1
3 5 4
3
样例输出
24
提示
对于100%的数据,保证 \(1 <= N,ai,M <= 100, 1 <= sj,ci <= 10^9, 1 <= pj,bj <= 100\)
这道题很简单,我们只需要统计每种绿宝石要是全买所需要的价钱,最后根据需要的种类累加即可
但一看数据范围,种类竟可达到 \(10^9\) 很明显作为数组下标是不行的,但是又会发现我们实际上只会用到最多 \(100\times100\) 的种类,很明显要么离散化,要么 \(map\)
这里写的 \(map\) (毕竟只要确定映射关系即可)
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long ans;//不开long long见祖宗
map<int,int> mp;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++){
int s,p,b;
scanf("%d%d%d",&s,&p,&b);
mp[s]+=p*b;
}
}
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
ans+=mp[x];
}
printf("%lld",ans);
return 0;
}
标签:int,long,绿宝石,ai,物品,交易,输入
From: https://www.cnblogs.com/HEIMOFA/p/17289611.html