Day2 - D - Find the Outlier

题目分析

给了一个D维多项式f(x)(D最大5),然后给了f(0),f(1)….f(n+2),其中有个f(x)是错误的,让你找出这个X。

假设有个方程f(x)=ax^5+bx^4+cx^3+dx^2+ex+f*1

给了你x和f(x),那么你等于可以得到7个6元等式,现在如果既可以的到一个7*6的矩阵,然后穷举删去某一行,如果删去的是一个错误的解的哪行,做一个高斯消元,然后必定会得到一行全0 (由计算公式可以直接的出)。由此可以判断哪行是错误的。

PS:进度问题,如何判断一个数是0,做题时,试了好几次不同的精度都不对,由于必定有一个解,所以,加了个判断最接近0 的一行作为错误解得出,AC通过。

AC代码

#include <iostream>
using namespace std;
int d;
double a[8][7];
double ans[7][7];
void transferM(double array[][7])
{
    int row1,row2,col;
    double m;
    for(row1=0;row1<d+2;row1++)
    {
       for(row2=row1+1;row2<d+2;row2++)
       {
          m=array[row2][row1]/array[row1][row1];
          for(col=row1;col<d+2;col++)
          {
            array[row2][col]-=array[row1][col]*m;
          }
        }
    }
}
void print(double ans[][7])
{
    int i,j;
    for (i=0;i<=d+2;i++){
        for (j=0;j<d+2;j++)
    {
        cout<<ans[i][j]<<" ";
    }cout<<endl;}
    cout<<endl;
}

void work(int k)
{
    int i,j,t;
    for (i=0,j=0;i<=d+2;i++)
    {
        if(i!=k)
        {
            for (t=0;t<d+2;t++)
                ans[j][t]=a[i][t];
            j++;
        }
    }
}

int main()
{
    while ((cin>>d) && d!=0)
    {
        int i,j,k;
        double tt=100000;int ta=0;
        for (i=d+2;i>=0;i--)
        {
            for (j=0;j<=d;j++)
            {
                a[i][j]=1;
                for (k=1;k<=d-j;k++)
                    a[i][j]*=(d+2-i);
            }
            cin>>a[i][d+1];
        }
        for (i=d+2;i>=0;i--)
        {
            work(i);
            transferM(ans);
            if(ans[d+1][d+1]<0)ans[d+1][d+1]*=-1;
            if(ans[d+1][d+1]<tt)
            {
                tt=ans[d+1][d+1];
                ta=i;
            }
        }
        cout<<d+2-ta<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值