Auction Bidding 2017ACM-ICPC亚洲区(南宁赛区)网络赛C题
2017-09-26 16:33
543 查看
**题意:**ABC 公司举行了一场拍卖,有 N 个拍卖物品,编号从 1 到 N,并且有 M 个竞标人,编号为 1 到 M。竞标有一些规则:
1.每个物品有一个保留价格,为正数
2.每个竞标人最多给每个物品出一个价格,为正数
3.竞标人出的价格只有高于物品的保留价格时才是一个有效的价格。无效的价格不被考虑。
4.出价最高的有效价格赢得物品。如果存在两个相同的最高有效价格,那么竞标人编号小的赢得物品。
5.一个竞标人赢得了物品,则成交价为第二大的有效竞标价乘以10%的结果和最大的竞标价中较小的一个。如果价格不是整数,则向下取整。
6.第二大的有效竞标价如果不存在,则视作物品的保留价格。
题目要求每个竞标人最终花了多少钱。
思路:题目有点长,但是还是比较简单的,自己竟然做了那么久。一开始想的是读取完前 N+2 行数据后,算出每个物品拍给了谁或没拍出去了。然后就能算出每个投标人一共花了多少钱了。写了好久感觉很乱。后来看队友写的思路大概是每读取完一条数据就算出这个物品卖给谁,这样子实现起来更加的方便。
做题目前思路一定要清晰,而且一个好的思路实现起来也会简单很多,不易出错。
代码:
1.每个物品有一个保留价格,为正数
2.每个竞标人最多给每个物品出一个价格,为正数
3.竞标人出的价格只有高于物品的保留价格时才是一个有效的价格。无效的价格不被考虑。
4.出价最高的有效价格赢得物品。如果存在两个相同的最高有效价格,那么竞标人编号小的赢得物品。
5.一个竞标人赢得了物品,则成交价为第二大的有效竞标价乘以10%的结果和最大的竞标价中较小的一个。如果价格不是整数,则向下取整。
6.第二大的有效竞标价如果不存在,则视作物品的保留价格。
题目要求每个竞标人最终花了多少钱。
思路:题目有点长,但是还是比较简单的,自己竟然做了那么久。一开始想的是读取完前 N+2 行数据后,算出每个物品拍给了谁或没拍出去了。然后就能算出每个投标人一共花了多少钱了。写了好久感觉很乱。后来看队友写的思路大概是每读取完一条数据就算出这个物品卖给谁,这样子实现起来更加的方便。
做题目前思路一定要清晰,而且一个好的思路实现起来也会简单很多,不易出错。
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <time.h> #include <stack> #include <queue> #include <vector> #include <fstream> using namespace std; #define LL long long int int N, M; LL R[1010]; //物品的保留价格 int B[1010]; //物品卖给谁了 LL P[1010]; //物品的最终定价 struct Bid{ int b; LL p; Bid(){} Bid(int a, LL c):b(a),p(c){} bool operator < (const Bid& bid){ if(p == bid.p) return b<bid.b; else return p>bid.p; } }; int main() { //freopen("in.txt", "r", stdin); scanf("%d%d", &N, &M); for(int i=1; i<=N; i++){ //读取一行数据处理一行 scanf("%d", &R[i]); int b; LL p; vector<Bid> vec; while(scanf("%d", &b)==1 && b!=-1){ scanf("%lld", &p); if(p < R[i]) continue; vec.push_back(Bid(b, p)); } sort(vec.begin(), vec.end()); if(vec.size() == 0){ //该物品没有人买或没有有效的价格 B[i] = 0; P[i] = 0; } else if(vec.size() == 1){ //该物品只有一个人买或只有一个有效的价格 B[i] = vec[0].b; P[i] = min(vec[0].p, (LL)(R[i]*1.1)); } else{ //该物品有多个人买或有多个有效的价格 B[i] = vec[0].b; P[i] = min(vec[0].p, (LL)(vec[1].p*1.1)); } } int k, q; scanf("%d", &k); while(k--){ scanf("%d", &q); LL ans = 0; for(int i=1; i<=N; i++){ if(B[i] == q){ ans += P[i]; } } printf("%lld\n", ans); } return 0; }
相关文章推荐
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛Train Seats Reservation(树状数组的运用)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L. The Heaviest Non-decreasing Subsequence Problem (LIS)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 The Heaviest Non-decreasing Subsequence Problem 最长不下降序列
- A Cache Simulator 组成原理 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛-- B. Train Seats Reservation-(区间更新,单点查询思想)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L题 非递减权值最大
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles
- Finding the Radius for an Inserted Circle 笛卡尔定理 - 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- The Heaviest Non-decreasing Subsequence Problem 最长非递减子序列 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B. Train Seats Reservation(贪心问题+区间覆盖)
- ACM 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B. Train Seats Reservation
- 计蒜客 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L题
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F.Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛- J. Minimum Distance in a Star Graph
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J. Minimum Distance in a Star Graph
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L. The Heaviest Non-decreasing Subsequence Problem(最长非减子序列+思路)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J Minimum Distance in a Star Graph 广度优先搜索