据说对银行账户进行盗窃时,如果只盗取小数点下的数值,就不容易引起注意,所以你决定进行尝试。
银行总共有�n个账户,�m次转账,对每次转账,你可以盗取(转账金额-转账金额下取整)的资金,并使转入账户的警戒值增加相同数值,当任意账户的警戒值>1>1,或者无法实现转账 (转出账户余额不足),或者�m次转账全部完成,你停止盗取,请计算总盗取金额。
格式
输入格式:第一行�,�n,m,表示有�n个账户,�m条转账记录;
第二行�n个实数,表示每个账户的资金;
接下来�m行,每行有三个参数;
整数�x,整数�y,实数�z,分别表示转出账户,转入账户,和转账金额。
输出盗取金额,保留两位小数。
样例 1
输入:5 5 2 2 2 2 2 1 2 1.5 2 1 1.5 1 2 1.5 2 1 1.5 1 2 1.5复制 输出:
2.00复制
备注
1≤�≤1000,1≤�≤100001≤n≤1000,1≤m≤10000;
0<每个账户初始资金<100<每个账户初始资金<10;
1≤�,�≤�,�≠�1≤x,y≤n,x=y;
0<�<1000<z<100;
样例解释:
第一次转账后:0.5 3 2 2 2,已盗取金额 0.5,账户 2 警戒值 0.5;
第二次:1.5 1.5 2 2 2,已盗取 1,账户 1 警戒值 0.5;
第三次:0 2.5 2 2 2,已盗取 1.5,账户 2 警戒值 1;
第四次:1 1 2 2 2,已盗取 2,账户 1 警戒值 1;
第五次,账户 1 余额不足,转账无法进行,停止。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<bits/stdc++.h> using namespace std; typedef double db; int n,m,x,y; db a[1002],f[1002],z,ans; int main(){ freopen("2.in","r",stdin); freopen("2.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%lf",&a[i]); while(m--){ scanf("%d %d %lf",&x,&y,&z); if(a[x]<z) break; ans+=(double)(z-(int)(z)); f[y]=f[y]+(double)(z-(int)(z)); a[x]-=z; a[y]+=(int)(z); if(f[y]>1) break; } printf("%.2lf",ans); return 0; }
标签:转账,1.5,警戒,MT2040,账户,银行,盗取,include From: https://www.cnblogs.com/wuhu-JJJ/p/18127306