时间限制:5秒
空间限制:65536K
实现一个简易的秒杀服务,有3个接口:
1. 添加一个秒杀活动 addActivity(int startTime, int endTime, int goodsId, int limitQuantity)
参数说明:
# 时间区间为左闭右开:[startTime, endTime) 。数据保证 startTime < endTime,startTime 大于当前时间戳
# goodsId 一定为存在的商品id。每个goodsId至多添加一次秒杀活动。
# limitQuantity > 0
返回值有以下两种情况:
# 添加成功,返回秒杀活动ID (从0开始自增)
# 秒杀商品数量大于商品库存,添加失败,返回-1
2. 购买秒杀商品 buyGoods(int activityId, int quantity)
参数说明:
# activityId 一定是请求时存在的活动id
# quantity > 0
返回值有以下三种情况:
# 购买成功,减少库存,返回0
# 购买数量大于秒杀商品剩余数量,购买失败,返回-1
# 秒杀未开始或已结束,购买失败,返回-1
3. 获取秒杀活动列表 getActivityList() 获取当前时刻的秒杀活动列表
秒杀列表排序方式:进行中(未售罄) > 进行中(售罄) > 未开始
# 对于「进行中(未售罄)」:依次按商品人气值从高到低、商品ID从小到大排序
# 对于「进行中(已售罄)」:依次按最后卖出时间从晚到早、商品人气值从高到低、商品ID从小到大排序
# 对于「未开始」:依次按开始时间从早到晚、商品人气值从高到低、商品ID从小到大排序
# 对于已结束的秒杀,不返回。
返回秒杀活动id列表
商品拥有以下属性:
# 商品ID,32位非负整数
# 人气值,32位非负整数
# 库存,32位非负整数
现给出一串请求,每个请求的格式为:时间戳 函数名 参数。请对每个请求都输出其返回结果 (请求已经按照时间先后顺序排序过) 。
数据范围:
# 商品数量 N <= 10,000
# 请求数量 M <= 10,000
# add 数量 A <= 1,000
# buy 数量 B <= 10,000
# list 数量 L <= 100
输入描述:
第一行是两个整数 N 和 M ,分别表示商品数量和请求数量。
接下来有 N 行,每行表示一个商品,具体格式为:3个整数(被空格分隔)分别表示商品ID,人气值,库存
接下来有 M 行,每行表示一个请求,请求已经按时间戳从小到大排序。
具体格式为:时间戳 请求类型 请求参数…
# 时间戳:正整数
# 请求类型,共三种:”add”, “buy” 和 “list”
# 请求参数:按题目描述中的顺序,参数之间空格分隔
输出描述:
对每个请求,输出其返回值,一个请求的输出占一行:
# add:成功输出id,失败输出-1
# buy:成功输出0,失败输出-1
# list:输出活动id列表,按要求的顺序,相邻数字之间用一个空格分隔。若列表为空,则输出空行。
示例1
输入
6 13
1001 1 10
1002 1 10
1003 2 10
1004 2 10
1005 2 10
1006 3 10
1 add 2 20 1001 10
2 buy 0 1
3 buy 0 10
4 add 5 6 1002 2
5 list
6 buy 1 1
7 add 10 20 1003 11
8 add 10 20 1003 8
9 add 10 20 1004 3
10 add 11 20 1005 5
11 add 20 30 1006 1
12 buy 3 3
13 list
输出
0
0
-1
1
0 1
-1
-1
2
3
4
5
0
2 4 0 3 5
解题思路:大模拟。
由于是笔试结束之后完善的题目,没有机会提交验证正确性,此处仅供参考。
#include
#include
#include
using namespace std;
const int Maxn = 10005;
struct Product
{
unsigned int id, population, num;
};
struct Activity
{
int startTime, endTime, id, activityId, num, saleTime;
};
int n, Time;
Product product[Maxn];
vector activity;
bool sale(Activity& a, Activity& b)
{
if(product[a.id].population!=product[b.id].population)
return product[a.id].population>product[b.id].population;
return product[a.id].idbool finishing(Activity& a, Activity& b)
{
if(a.saleTime!=b.saleTime)
return a.saleTime>b.saleTime;
if(product[a.id].population!=product[b.id].population)
return product[a.id].population>product[b.id].population;
return product[a.id].idbool cmpTime(Activity& a, Activity& b)
{
if(a.startTime!=b.startTime)
a.startTimeif(product[a.id].population!=product[b.id].population)
return product[a.id].population>product[b.id].population;
return product[a.id].idint addActivity(int startTime, int endTime, int id, int limit)
{
for(int i = 0; i < n; ++i)
if(product[i].id==id)
{
if(limit<=product[i].num)
{
Activity tmp;
tmp.startTime = startTime;
tmp.endTime = endTime-1;
tmp.num = limit;
product[i].num-=limit;
tmp.id = i;
tmp.saleTime = -1;
tmp.activityId = activity.size();
activity.push_back(tmp);
return tmp.activityId;
}
return -1;
}
}
int buyGoods(int activityId, int num)
{
if(activity[activityId].num>=num)
{
if(Time>=activity[activityId].startTime && Time<=activity[activityId].endTime)
{
activity[activityId].num-=num;
activity[activityId].saleTime = Time;
return 0;
}
return -1;
}
return -1;
}
void getActivityList()
{
vector saling;
vector finish;
vector future;
for(int i = 0; i < activity.size(); ++i)
{
if(Time>=activity[i].startTime && Time<=activity[i].endTime)
{
if(activity[i].num>0)
saling.push_back(activity[i]);
else
finish.push_back(activity[i]);
}
if(Timeint all = saling.size()+finish.size()+future.size();
if(all==0)
{
cout << endl;
return;
}
sort(saling.begin(), saling.end(), sale);
sort(finish.begin(), finish.end(), finishing);
sort(future.begin(), future.end(), cmpTime);
int count = 0;
for(int i = 0; i < saling.size(); ++i)
cout << saling[i].activityId << ((++count==all)?'\n':' ');
for(int i = 0; i < finish.size(); ++i)
cout << finish[i].activityId << ((++count==all)?'\n':' ');
for(int i = 0; i < future.size(); ++i)
cout << future[i].activityId << ((++count==all)?'\n':' ');
}
int main()
{
int m, startTime, endTime, id, limit, num;
string query;
while(cin >> n >> m)
{
for(int i = 0; i < n; ++i)
cin >> product[i].id >> product[i].population >> product[i].num;
while(m--)
{
cin >> Time;
cin >> query;
if(query=="add")
{
cin >> startTime >> endTime >> id >> limit;
cout << addActivity(startTime, endTime, id, limit) << endl;
}
else if(query=="buy")
{
cin >> id >> num;
cout << buyGoods(id, num) << endl;
}
else
getActivityList();
}
}
return 0;
}
/*
6 13
1001 1 10
1002 1 10
1003 2 10
1004 2 10
1005 2 10
1006 3 10
1 add 2 20 1001 10
2 buy 0 1
3 buy 0 10
4 add 5 6 1002 2
5 list
6 buy 1 1
7 add 10 20 1003 11
8 add 10 20 1003 8
9 add 10 20 1004 3
10 add 11 20 1005 5
11 add 20 30 1006 1
12 buy 3 3
13 list
*/