【MT2040】银行账户

据说对银行账户进行盗窃时,如果只盗取小数点下的数值,就不容易引起注意,所以你决定进行尝试。

银行总共有n个账户,m次转账,对每次转账,你可以盗取(转账金额-转账金额下取整)的资金,并使转入账户的警戒值增加相同数值,当任意账户的警戒值>1>1,或者无法实现转账 (转出账户余额不足),或者m次转账全部完成,你停止盗取,请计算总盗取金额。

格式
输入格式:

第一行�,�nm,表示有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≤�≤100001n1000,1m10000;
0<每个账户初始资金<100<每个账户初始资金<10;
1≤�,�≤�,�≠�1x,yn,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;
}

 

posted @ 2024-04-10 20:01  #Cookies#  阅读(41)  评论(0编辑  收藏  举报