题目描述

在一个游戏中有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. vscode——常用插件记录

    前言 本人vscode中使用的插件列表,记录下. 列表 Auto Rename Tag 自动重命名成对的超文本标记语言/可扩展标记语言 background-cover 为vscode设置背景图片 C ...

  2. 小米BL不解锁刷机

    关于小米NOTE顶配近期解锁的问题中发现还有很多人不会用9008模式刷机,现出个简单教程方便米粉们救砖.硬件:小米NOTE顶配手机 win10系统的电脑 手机与电脑相连的数据线软件:老版本的mifla ...

  3. python变量选中后高亮显示

    file>settings>editor>color scheme>general>code>identifier under caret>backgroun ...

  4. file 的类型 input

    上传你选择的文件和相关信息.在 HTML 文档中 <input type="file"> 标签每出现一次,一个 FileUpload 对象就会被创建.该元素包含一个文本 ...

  5. 洛谷 P2813【母舰】 题解

    总体思路: 输入护盾和攻击力,然后快速排序sort走起来, 排完序之后从第一个开始找,如果攻击力大于护盾,护盾继续下一个, 这个攻击力记录为0,如果小雨的话,那就攻击力继续下一个,护盾不动, 其中最为 ...

  6. linux命令之------Find命令

    Find命令 1)作用:用来在指定目录下查找文件. 2)案例:将当前目录及其子目录下所有延申档名是c的文件列出来. Find -name “*.txt” 其中:*表示通配任意个字符:?表示通配单个字符 ...

  7. 在Matlab中的tick可以调整方向

    需要将axis对话框的More property打开,修改TickDir,可从In改成Out.

  8. GoCN每日新闻(2019-10-24)

    GoCN每日新闻(2019-10-24) GoCN每日新闻(2019-10-24) 1. 学习Golang之服务器框架编写 – CS网络通信 http://1t.click/aJag 2. 如何实现 ...

  9. anki的使用以及anki server的配置

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/anki_and_anki_server 首先吐槽,anki作为老 ...

  10. 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。 buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t”分割

    实验内容(mapReduce安装请按照林子雨教程http://dblab.xmu.edu.cn/blog/631-2/) 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为 ...