题目描述

在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能“折射”,即减少自己受到的伤害,并将这部分伤害分摊给其他人。对于每个折射关系,我们用数对\((x_i,y_i,z_i)\)来表示\(x_i\)将自己受到伤害去掉\(z_i\)的比例,将这些伤害转移给\(y_i\)(\(x_i,y_i\)是整数,\(z_i\)是实数)。

求出经过反复折射后最后每个英雄受到的实际总伤害。

输入格式

第一行一个正整数:\(n\),表示有\(n\)个英雄,第二行\(n\)个整数\(A_i\),依次表示每个英雄受到的初始伤害。第三行一个正整数\(m\),表示有\(m\)对折射关系。接下来\(m\)行,每行三个数\(x_i,y_i,z_i\),表示\(x_i\)将自己受到伤害去掉\(z_i\)的比例,将这些伤害转移给\(y_i\)。

输出格式

输出\(n\)行,第\(i\)行表示第\(i\)个英雄最后受到的实际总伤害。保留六位小数。

样例

样例输入

3
1 0 2
3
1 2 0.3000
1 2 0.2000
2 1 0.5000

样例输出

0.666667
0.333333
2.000000

数据范围

题解

设\(D_i\)为分摊伤害后\(i\)最终受到的伤害,\(C_i\)为\(i\)自己真实受到的的伤害占总伤害的比例,\(T_{i,j}\)表示\(i\)总共分给\(j\)的伤害的比例。

那么\(D_i\)中除了第一次天降的伤害\(A_i\),其他伤害都是来源于别人的分摊,那么可以很轻松地推出一个式子:

\[\frac{D_i}{C_i}=\sum_{j≠i}\frac{D_j}{C_j}\cdot T_{j,i}+A_i
\]

直接按照这个式子建立关于\(D_i\)的方程组,然后高斯消元解方程即可。

\(Code:\)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 205
#define M 20005
#define eps 1e-6
int n, m, A[N];
long double val[N][N], mat[N][N];
long double ans[N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &A[i]), val[i][i] = 1;
int x, y;
double c;
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d%lf", &x, &y, &c);
val[x][y] += c;
val[x][x] -= c;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
if (i != j)
mat[i][j] = -val[j][i] / val[j][j];
mat[i][i] = 1 / val[i][i];
mat[i][n + 1] = -A[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
if (fabs(mat[j][i]) > eps)
{
for (int k = i; k <= n + 1; k++)
swap(mat[i][k], mat[j][k]);
break;
}
long double s = mat[i][i];
for (int j = i; j <= n + 1; j++)
mat[i][j] /= s;
for (int j = i + 1; j <= n; j++)
{
s = mat[j][i];
for (int k = i; k <= n + 1; k++)
mat[j][k] -= s * mat[i][k];
}
}
ans[n + 1] = 1;
for (int i = n; i >= 1; i--)
for (int j = i + 1; j <= n + 1; j++)
ans[i] -= mat[i][j] * ans[j];
for (int i = 1; i <= n; i++)
printf("%.6lf\n", double(ans[i]));
}

「中山纪中集训省选组D4T1」折射伤害 高斯消元的更多相关文章

  1. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  2. 「中山纪中集训省选组D2T1」书堆 欧拉常数

    题目描述 蚂蚁是勤劳的动物,他们喜欢挑战极限.现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边缘.蚂蚁喜欢整洁的布置,所以 ...

  3. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  4. 中山纪中集训Day5叒是测试(划淼)

    A组T1 矩阵游戏(game) 九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M ...

  5. 中山纪中集训Day1测试(摸鱼)

    AT3 粉刷匠 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不 ...

  6. 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2

    A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...

  7. 中山纪中集训Day2又是测试(划水)

    A组T1 bzoj 2674 Attack Description chnlich 非常喜欢玩三国志这款游戏,并喜欢用一些策略出奇制胜.现在,他要开始征服世界的旅途了.他的敌人有N 座城市和N 个太守 ...

  8. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  9. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

随机推荐

  1. GlusterFS集群文件系统研究

    https://blog.csdn.net/liuaigui/article/details/6284551 1.      GlusterFS概述GlusterFS是Scale-Out存储解决方案G ...

  2. 《vue》实现动态显示与隐藏底部导航方法!

    在日常项目中,总有几个页面是要用到底部导航的,总有那么些个页面,是不需要底部导航的,这里列举一下页面底部导航的显示与隐藏的两种方式: 其实很简单,我们在路由里面带上参数,这个参数就用来区分那个页面显示 ...

  3. web大附件上传,支持断点续传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  4. Python爬虫 | 多线程、多进程、协程

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...

  5. check_monitor

    #! /bin/bash # 声明agent配置文件路径 CONF=/etc/sdata/zabbix/zabbix_agentd.conf #CONF=/tmp/zabbix_agentd.conf ...

  6. Xamarin Forms 实现发送通知点击跳转

    1. Ensure the you have set LaunchMode.SingleTop on your MainActivity: LaunchMode.SingleTop [Activity ...

  7. MongoDB---如何避免插入重复数据(pymongo)

    以下摘自pymongo文档: update_one(filter, update, upsert=False) update_many(filter, update, upsert=False) fi ...

  8. 【Codeforces】CF367D Sereja and Sets (数学)

    题目大意 1到n这n个正整数被分成了m个不相交的集合(集合不一定连续),现在从这m个集合中选出最少个数的集合,满足对于[1,n]中任意一个长度为d的区间都至少有一个数字出现在已选集合中.(1 < ...

  9. ACR Code Pacs

    ACR Index for Radiological Diagnosis 简称ACR Index,ACR Key或ACR Code,是一种应用于影像学分类的病理编码,由美国放射学院(American ...

  10. Netty 读写检测机制(心跳)

    一.创建服务端 1.MyServer 类 public class MyServer { public static void main(String[] args) throws Exception ...