「Wdoi-4」兔已着陆 题解
题目链接
题目分析
题目要求我们构建一个类似于“栈”的数据结构,这在很大程度上减少了我们的思考量。既然是栈,肯定要满足先进后出的基本性质,这是再来看一下题目:
此时清兰会依次从栈顶取出 k k k 个团子并售出。保证 k k k 不大于当前栈内的团子个数。
这就很明了了。意思就是说对于顾客的每次购买,都会优先从新出炉的那一批团子中取出一部分卖给顾客。接下来就是数据结构的选取。虽说是栈,但如果把每个团子都放进去肯定会炸,所以考虑使用结构体储存每一批次的生产信息。看一下伪代码:
定义变量;
输入操作的次数;
while(次数--){
输入操作种类;
if(生产){
输入两个端点的值;
}else{
输入要购买的数量;
定义已经购买的个数;
while(个数不够){
个数更新;
价格累加;
删除已经卖掉的团子;
}
定义一个左端点l,[l,r]都是卖出去的;
价格累加;
删去卖掉的一部分;
输出价格;
}
}
AC Code
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 500001;
typedef unsigned long long ll;
ll ans, k;
struct tuanzi {
ll l, r;
} a[MAXN];
ll n,op,sum,p;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> op;
if (op == 1) {
cin >> a[++p].l;
cin >> a[p].r;
} else {
cin >> k;
sum = 0;
while (k > (a[p].r - a[p].l + 1)) {
k -= a[p].r - a[p].l + 1;
sum += (a[p].l + a[p].r) * (a[p].r - a[p].l + 1) / 2; //等差数列求和
p--;
}
int l = a[p].r - k + 1; //上面一段的左端点
sum += (a[p].r + l) * (a[p].r - l + 1) / 2;
a[p].r = l-1; //将已经卖出的一部分减掉
printf("%lld\n",sum);
}
}
return 0;
}
提交记录
C++ 20 O2优化
代码长度:678B;
共用时:4.99s;
最长用时:448ms;
内存:8.02MB;