某一天的题解

这篇博客探讨了如何利用队列优化计算过程,特别是在处理连续重复数据时。文章通过一个C++代码示例解释了如何用队列来处理这种问题,将原本的暴力方法改进为更高效的方法。此外,还介绍了递归思想在解决问题中的应用,以一个递归函数为例展示了如何生成特定格式的字符串序列。
摘要由CSDN通过智能技术生成

#include<iostream>
#include<queue> 
#define int long long

using namespace std;

typedef pair<int,int> PII;
typedef long long LL;

int m;
queue<PII> q;

signed main(){
    cin>>m;
    while(m--){
    	int a;
    	cin>>a;
    	if(a==1){
    		int x,c;
    		cin>>x>>c;

    		q.push({x,c});
		}
		else{
			int c;
			cin>>c;
			LL sum=0;
			while(c>0){
				if(c<q.front().second){
					sum+=c*q.front().first;
					q.front().second-=c;
					c=0;
				}
				else{
					sum+=(q.front().first)*(q.front().second);
					c-=q.front().second;
					q.pop();
				}
			}
			cout<<sum<<endl;
		}
	}
    
    return 0;
}

 开始考虑暴力

可以看出要用队列,先进先出

那他给c个数x,那就在队列里放c个x,每次要拿c个就那c个,每次把拿出来的加起来就行;

这是暴力,但是可以改进,因为这个队列里的数据是有连续重复的,那是不是可以把拿出来的操作换成乘呢

实现就是不只把x存起来,对应x的个数也对应存起来,那么就可以考虑一下pair<int ,int>

即把有c个x存起来,那么每次存就只需要一步,拿就只需要考虑要拿的c(红色表示要拿出来的个数)个数跟队头的个数的大小;

如果队头大,就把队头的个数减去c(方便下一个操作),拿出来的和就是c*x,此时c=0(用来跳出循环);如果队头小,就可以把队头的c*x,(黑色的c表示队列存储的个数),然后把此时队头去掉,表示前c个都拿完了,然后c-c;

但是去掉队头之后还要判断一下还要不要拿,也就是说c还要判断一下要不要在进行上面的操作,也就是说要有一个循环前提,保证c>0,如果c符合条件(即还要拿)那么就要继续循环判断这一次队头的c和这一次的c

 

#include<iostream>

using namespace std;

int n; 

void fun(int n){
	//s[n]=s[n-1],n,s[n-1]
	if(n==1){
		cout<<1<<' ';
		return;
	}	
	fun(n-1);
	cout<<n<<' ';
	fun(n-1);
}

int main()
{
	cin>>n;
	fun(n);
	return 0;
}

 运用递归思想

我认为递归可能就是从后往前想;要写s[n]=s[n-1],n,s[n-1];s[n-1]=s[n-2],n-1,s[n-2]

·····

s[3]=s[2],3s[2],s[2]=s[1],2,s[1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值