#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]