UVALive - 6185 Find the Outlier暴力填表+高斯消元+卡eps

https://cn.vjudge.net/problem/UVALive-6185

我真的是服了orz eps 1e5,1e6过不了 开1e2 1e1都能过

题意:给你一个d阶多项式f的f(0),f(1)...f(d+1),f(d+2) 有一个是错误的,问第几个是错的

题解:题目多给了两个方程(约束)。

想了一下如果只给一个,是找不出来的。

给两个的话,可以这么考虑:

  先取出一个方程X,再取剩下的n个高斯消元一下,将解得的系数带入最后一个方程,if成立,说明X是错的,else再取另一个(说明错误的在n个 或最后一个)。

坑:下标无限搞错,对着样例1写了一下,虽然具体一些,但有个d+1写成了3orz

#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include<cstdio>
#include<vector>
#define rep(i,t,n)  for(int i =(t);i<=(n);++i)
#define per(i,n,t)  for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn= 10000009;
double a[15][15],aa[15][15], del;
double eps = 5e-5;
/*高斯消元,系数矩阵为a[i][j],i=1…n,j=1…n,常数为a[i][n+1],i=1…n,返回值为是否有唯一解,答案存在a[i][n+1]*/
bool gauss(int n) {
    for (int i = 1; i <= n; i++) {
        int k = i;
        for (int j = i + 1; j <= n; j++)if (fabs(a[j][i]) > fabs(a[k][i]))k = j;
        if (fabs(del = a[k][i]) < eps)return 0;
        for (int j = i; j <= n + 1; j++)swap(a[i][j], a[k][j]);
        for (int j = i; j <= n + 1; j++)a[i][j] /= del;
        for (k = 1; k <= n; k++)if (k != i) {
            del = a[k][i];
            for (int j = i; j <= n + 1; j++)a[k][j] -= a[i][j] * del;
        }
    }
    return 1;
}

int main() {
    int  d;
    while (cin >> d&&d) {
        mmm(a, 0);
        mmm(aa, 0);
        rep(i, 1, d + 3) {
            //cin >> aa[i][d + 2];
            scanf("%lf", &aa[i][d + 2]);
            //aa[i][d + 2] = aa[i][d + 1];
        }aa[1][1] = 1;

        rep(i, 1, d + 2) {
            rep(j, 1, d+1) {
                aa[i+1][j] =pow(1.0*i, j-1);
            }
        }
        rep(k, 1, d + 3) {
            int tot = 1;
            rep(i, 1, d + 3)if (i != k&&tot<=d+1) {  rep(j, 1, d+2) a[tot][j] = aa[i][j]; tot++;}
            if (!gauss(d + 1))continue;
            double temp = 0;
            int last = d + 3;
            if (k == d + 3)last--;
            rep(i, 1, d+1)
                temp += a[i][d + 2] * aa[last][i];
             if (abs(temp - aa[last][d + 2]) < 0.5) {
                cout << k - 1 << endl; break;
            }

        }

    }
}
/*
1
1
2
2

4
42.4715310246
79.5420238202
28.0282396675
-30.3627807522
-49.8363481393
-25.5101480106
7.58575761381
*/
/*
2
1.0
4.0
12.0
16.0
25.0
1
-30.5893962764
5.76397083962
39.3853798058
74.3727663177
4
42.4715310246
79.5420238202
28.0282396675
-30.3627807522
-49.8363481393
-25.5101480106
7.58575761381
5
-21.9161699038
-48.469304271
-24.3188578417
-2.35085940324
-9.70239202086
-47.2709510623
-93.5066246072
-82.5073836498
0*/

原文地址:https://www.cnblogs.com/SuuT/p/9532172.html

时间: 2024-10-20 01:29:20

UVALive - 6185 Find the Outlier暴力填表+高斯消元+卡eps的相关文章

UVALive 6449 IQ Test --高斯消元?

题意:给你一串数字,问这串数字符合f[n] = a*f[n-1],f[n] = a*f[n-1]+b*f[n-2],f[n] = a*f[n-1]+b*f[n-2]+c*f[n-3]这几个方程中的哪个,然后要你给出第n+1项,如果符合多个方程,项数小的优先(第一个方程优先). 解法:这题我先处理看是否满足f[n] = a*f[n-1]的形式,如果不满足,则用高斯消元借出两项和三项的情况的a,b,c,比如第二个方程,f[3] = a*f[2]+b*f[1],f[4] = a*f[3]+b*f[2]

BZOJ 2466 中山市选2009 树 高斯消元+暴力

题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace std; int n,m; int f[M][M],is_free[M],tot; int ans[M],cnt; void

【枚举】【高斯消元】Gym - 101412D - Find the Outlier

给你一个未知的d次多项式在0,1,...,d+2处的取值,其中有且只有一个是错的,问你哪个是错的. 枚举哪个是错的,再在剩下的d+2个中取d+1个高斯消元,解出多项式系数,然后代一下最后剩下的那个数看看是否合法,如果合法再看看那个错的是否真的错了. #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; #define N 11 d

First Knight UVALive - 4297(优化高斯消元解概率dp)

题意: 一个矩形区域被分成 m*n 个单元编号为 (1, 1)至 (m, n),左上为 (1, 1),右下为(m, n).给出P(k)i,j,其中 1 ≤ i ≤ m,1 ≤ j ≤ n,1 ≤ k ≤ 4,表示了 (i, j)到 (i+1, j),(i, j+1),(i-1, j),(i, j-1)的概率.一个骑士在 (1, 1),按照给定概率走,每步都于之前无关,问到达 (m, n)的期望步数. 解析: 很容易想到 然后移项  写出行列式 图截自大佬题解 矩阵中 概率为负 1为正 是因为移项

线代之高斯消元

数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解.但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵.不过,如果有过百万条等式时,这个算法会十分省时.一些极大的方程组通常会用迭代法以及花式消元来解决.当用于一个矩阵时,高斯消元法会产生出一个"行梯阵式".高斯消元法可以用在电脑中来解决数千条等式及未知数.亦有一些方法特地用来解决一些有特别排列的系数的方程组. 2968: Lights  Time Limit(Common

BZOJ2115 WC2011 Xor DFS+高斯消元

题意:给定一张无向图,求1到N异或和最大的路径,允许重复经过. 题解:首先跑出1到N的一条路径,答案就是在这条路径上不断加环.首先用DFS处理出所有基环的异或和(其他环一定由基环构成,重复部分异或之后就会消掉),然后就是从一堆数里选任意个数使得异或和最小了,怎么做可以去看莫涛的课件(同解01异或方程),这里我简单介绍一下. 通过高斯消元,我们对原来的数进行操作,使得所有原来的数都可以用操作之后的数来组合而成(这玩意貌似叫线性基啊).具体做法就是从高到低暴力枚举每一位i,找到一个第i位为1的数j,

HDU 3359 Kind of a Blur(高斯消元)

题意: H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B.给定矩阵B,求矩阵A. 题目先给宽再给高...坑我了一个小时 code /* 暴力确定每个位置有到那些位置的曼哈顿距离小于D 然后对你n*m个未知数,n*m个方程进行高斯消元 */ #include <iostream> #include <cstdio> #include <cmath> #

【bzoj4184】shallot 线段树+高斯消元动态维护线性基

题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大. 这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗? 你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0. 输入 第一行一个正整数n表示总时间:第二行n个整数a1,a2...an,

2016 CCPC 网络赛 B 高斯消元 C 树形dp(待补) G 状压dp+容斥(待补) H 计算几何

2016 CCPC 网络赛 A - A water problem 水题,但读题有个坑,输入数字长度很大.. B - Zhu and 772002 题意:给出n个数(给出的每个数的质因子最大不超过2000),选出多个数相乘得b.问有多少种选法让b 为完全平方数. tags:高斯消元,求异或方程组解的个数.   好题 每个数先素数分解开.  对于2000以内的每个素数p[i],这n个数有奇数个p[i]则系数为1,偶数个则系数为0,最后n个数的p[i]系数异或和都要为0才会使得最后的积为完全平方数.