题目原意很简单,就是解一个三元一次方程组

直接高斯消元解方程组,枚举最后一列的倍数(k)

注意double的精度,有很多细节需要处理

 /*
PROB:ratios
LANG:C++
*/ #include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 5
double A[][],a[][]; typedef double Matrix[maxn][maxn]; void solve(Matrix A,int n)
{
int i,j,k,r; for (i=;i<n;i++)
{
r=i;
for (j=i+;j<n;j++)
if (fabs(A[j][i])>fabs(A[r][i]))
r=j;
if (r!=i)
for (j=;j<=n;j++)
swap(A[r][j],A[i][j]); for (k=i+;k<n;k++)
{
double f=A[k][i]/A[i][i];
for (j=i;j<=n;j++)
A[k][j]-=f*A[i][j];
}
}
for (i=n-;i>=;i--)
{
for (j=i+;j<n;j++)
A[i][n]-=A[j][n]*A[i][j];
A[i][n]/=A[i][i];
}
} bool satisify(double x,double y,double z)
{
int t1=x+0.5,t2=y+0.5,t3=z+0.5; //+0.5四舍五入,处理精度问题
//比如原来是4.9999999,直接转成int就成了4,完蛋啦T^T
double xx=x-t1,yy=y-t2,zz=z-t3;
double comp=pow(,-); //double的比较法= =,差值小于10^-10就算相等了
if ((fabs(xx)<=comp)&&(fabs(yy)<=comp)&&(fabs(zz)<=comp))
return true;
else
return false;
} int main()
{
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout); int x,y,z,t1,t2,t3;
double dx,dy,dz;
bool sol=false; scanf("%d %d %d",&x,&y,&z);
//A[0][3]=x; A[1][3]=y; A[2][3]=z;
t1=x; t2=y; t3=z;
scanf("%d %d %d",&x,&y,&z);
A[][]=x; A[][]=y; A[][]=z;
scanf("%d %d %d",&x,&y,&z);
A[][]=x; A[][]=y; A[][]=z;
scanf("%d %d %d",&x,&y,&z);
A[][]=x; A[][]=y; A[][]=z;
/*
for (int i=0;i<=2;i++)
{
for (int j=0;j<=3;j++)
printf("%.8f ",A[i][j]);
printf("\n");
}
*/
for (int i=;i<=;i++)
{
for (int i=;i<=;i++)
for (int j=;j<=;j++)
a[i][j]=A[i][j];
a[][]=t1*i;
a[][]=t2*i;
a[][]=t3*i;
//printf("%.8f %.8f %.8f\n",a[0][3],a[1][3],a[2][3]);
solve(a,);
dx=a[][]; dy=a[][]; dz=a[][];
//printf("%.8f %.8f %.8f\n",dx,dy,dz);
if (satisify(dx,dy,dz))
{
sol=true;
int xx=dx,yy=dy,zz=dz;
//printf("%d %d %d\n",xx,yy,zz);
if (xx<||yy<||zz<)
printf("NONE\n");
else
{
xx=dx+0.5; yy=dy+0.5; zz=dz+0.5;
printf("%d %d %d %d\n",xx,yy,zz,i);
}
break;
}
//printf("%.8f %.8f %.8f\n",a[0][3],a[1][3],a[2][3]);
}
if (!sol) printf("NONE\n"); } /* int main() //垃圾代码,一开始YY的错了
{
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout); double a1,a2,a3,a0,b1,b2,b3,b0,c1,c2,c3,c0,A0,A1,A2,A3,B0,B1,B2,B3,C0,C1,C2,C3;
int xx,yy,zz;
bool sol=false;
cin>>A0>>B0>>C0;
cin>>A1>>B1>>C1; //line1
cin>>A2>>B2>>C2; //line2
cin>>A3>>B3>>C3; //line3 for (int i=1;i<=100;i++)
{
a0=A0*i; a1=A1; a2=A2; a3=A3;
b0=B0*i; b1=B1; b2=B2; b3=B3;
c0=C0*i; c1=C1; c2=C2; c3=C3; double t0=b1*c1,t1=c1*a1,t2=a1*b1;
a1=a1*t0; a2=a2*t0; a3=a3*t0; a0=a0*t0;
b1=b1*t1; b2=b2*t1; b3=b3*t1; b0=b0*t1;
c1=c1*t2; c2=c2*t2; c3=c3*t2; c0=c0*t2;
c1=c1-a1; c2=c2-a2; c3=c3-a3; c0=c0-a0;
b1=b1-a1; b2=b2-a2; b3=b3-a3; b0=b0-a0;
t0=c2; t1=b2;
b1=b1*t0; b2=b2*t0; b3=b3*t0; b0=b0*t0;
c1=c1*t1; c2=c2*t1; c3=c3*t1; c0=c0*t1;
c1=c1-b1; c2=c2-b2; c3=c3-b3; c0=c0-b0;
double z=c0/c3;
double y=(b0-b3*z)/b2;
double x=(a0-a3*z-a2*y)/a1;
printf("%%f %f %f\n",x,y,z);
if (satisify(x,y,z))
{
sol=true;
xx=x,yy=y,zz=z;
if (xx<0||yy<0||zz<0)
printf("NONE\n");
else
printf("%d %d %d %d\n",xx,yy,zz,i);
break;
}
}
if (!sol) printf("NONE\n");
return 0;
}
*/

扩展:POJ 1222

一个很著名的问题...

需要用高斯消元解带mod的方程组.....真心没看懂

http://mathworld.wolfram.com/LightsOutPuzzle.html

http://www.cnblogs.com/devtang/archive/2012/07/24/2606728.html

USACO 3.2 ratios 高斯消元的更多相关文章

  1. BZOJ1770:[USACO]lights 燈(高斯消元,DFS)

    Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...

  2. POJ 3185 The Water Bowls 【一维开关问题 高斯消元】

    任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  5. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  6. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  7. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  8. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  9. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

随机推荐

  1. u3d 模型ID配置

    换模型为什么要改代码 0.0 你没有逻辑ID->模型的配置么. 做2个配置.. 分别是角色的ID对应模型路径. 然后是里面的动画名对应真实动画名. 比如 ID=1 path = "xx ...

  2. C和指针笔记 3.6链接属性

    链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域也它的链接属性有关,但这两个属性并不相同. 没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的 ...

  3. 3016 质子撞击炮 II

    3016 质子撞击炮 II  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description [抱歉数据错误~~已修 ...

  4. Entity Framework版本历史概览

    转自:http://www.cnblogs.com/fecktty2013/archive/2014/09/26/entityframework-overview.html EF版本 .net fra ...

  5. google project tango 学习笔记

    google io 2015上 project tango 的演示视频

  6. 2015国产犯罪传记《暴力天使》HD720P.泰语中字

    导演: 吴强编剧: 阮明玉主演: 张玉英 / 金理 / 至宝类型: 传记语言:泰语制片国家/地区: 中国大陆上映日期: 2016年3月25日片长: 92分钟又名: Huong Ga暴力天使的剧情简介 ...

  7. [git]图解git常用命令

    本文图解git中最常用的命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提 ...

  8. Java系列:JVM指令详解(上)(zz)

    一.未归类系列A 此系列暂未归类. 指令码    助记符                            说明    59:iastore    60:lload 6       //因为str ...

  9. [CareerCup] 13.6 Virtual Destructor 虚析构函数

    13.6 Why does a destructor in base class need to be declared virtual? 这道题问我们为啥基类中的析构函数要定义为虚函数.首先来看下面 ...

  10. (转)shell实例手册

    原文地址:http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9 实在是太好的资料了,不得不转 shell实例手册 0说明{ 手册制 ...