洛谷 P7870 兔已着陆 题解

「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;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值