小谢虽然有很多溶液,但是还是没有办法配成想要的溶液,因为万一倒错了就没有办法挽回了。因此,小谢到网上下载了一个溶液配置模拟器。模拟器在计算机中构造一种虚拟溶液,然后可以虚拟地向当前虚拟溶液中加入一定浓度、一定体积的这种溶液,模拟器会快速地算出倒入后虚拟溶液的浓度和体积。当然,如果倒错了可以撤销。 模拟器的使用步骤如下: 1)为模拟器设置一个初始体积和浓度 V0、C0%。 2)进行一系列操作,模拟器支持两种操作: P(v,c)操作:表示向当前的虚拟溶液中加入体积为 v 浓度为 c 的溶液; Z 操作:撤销上一步的 P 操作。
Input
第一行两个整数,表示 V0 和 C0,0≤C0≤100; 第二行一个整数 n,表示操作数,n≤10000; 接下来 n 行,每行一条操作,格式为:P_v_c 或 Z。 其中 _ 代表一个空格,当只剩初始溶液的时候,再撤销就没有用了,这时只输出初始的体积和浓度。 任意时刻质量不会超过 2^31 -1。
Output
n 行,每行两个数 Vi,Ci,其中 Vi 为整数,Ci 为实数(保留 5 位小数)。 其中,第 i 行表示第 i 次操作以后的溶液体积和浓度。
Sample Input
100 100 2 P 100 0 Z
Sample Output
200 50.00000 100 100.00000
answer:
#include <bits/stdc++.h>
using namespace std;typedef struct
{
int v;
double c;
}liquid;stack<liquid>vis;
int main()
{
int n,v0,v1,v2,v3,v4;
double c0,c1,c2,c3,c4;
char operate;
ios::sync_with_stdio(false);//减少输入时间;
cin>>v0>>c0>>n;
vis.push({v0,c0});//注意结构体入栈;
while(n--)
{
cin>>operate;
if(operate=='P')
{
cin>>v2>>c2;
v1=vis.top().v;//栈中结构体元素的获得;
c1=vis.top().c;
v3=v1+v2;
c3=(v1*c1+v2*c2)/v3;
printf("%d %.5lf\n",v3,c3);
vis.push({v3,c3});
}
if(operate=='Z')
{
if(vis.size()==1)//初始溶液情况
printf("%d %.5lf\n",v0,c0);
else
{
vis.pop();
v4=vis.top().v;
c4=vis.top().c;
printf("%d %.5lf\n",v4,c4);
}
}
}
return 0;
}