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

直接高斯消元解方程组,枚举最后一列的倍数(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. java 16 -7 泛型方法和泛型接口(泛型类相似)

    写一个ObjectTool类 泛型方法:把泛型定义在方法上 格式 public <泛型类型> 返回类型 方法名(泛型类型) 这样的好处是: 这个泛型方法可以接收任意类型的数据 public ...

  2. Java常用类库——Runtime

    runtime运行时候,是封装了一个JVM进程的类,每一个JAVA程序实际上启动了一个JVM进程,那么每个JVM对应一个runtime实例.此实例是由JVM为其实例化. 本类的定义中没有构造方法,因为 ...

  3. mysqli事务处理demo

    <?php  $mysqli=new mysqli("localhost", "root", "123456", "xsph ...

  4. CSS padding margin border属性

    主要定义四个区域:内容(content).内边距(padding).边框(border)和外边距(margin) margin:层的边框以外留的空白 background-color:背景颜色 bac ...

  5. aop介绍

  6. 【WPF】WPF中调用Winform

    1.添加两个引用:WindowsFormsIntegration.dll(负责整合WPF和Windows).System.Windows.Forms.2.在 XAML文件中添加两个引用(粗体部分): ...

  7. Linux 发送信号

    使用kill命令 --在命令行执行kill命令.向指定进程发送信号. 使用kill函数 int kill(pid_t pid,int sig); --参数pid指定一个要杀死的进程,而sig是要发送的 ...

  8. unity触发器和碰撞器

    Unity中检测碰撞的方法有两种,一种是触发器一种是碰撞器,现在我来解释一下两种的区别. 触发器:有三种方法,分别是OnTriggerEnter,OnTriggerStay,OnTriggerExit ...

  9. HttpClient, 使用C#操作Web

    我们知道, .Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求,基础类里没有直接提供相应的功能(WebClient类包含这 ...

  10. js第一天

    学习js的地址 http://www.w3school.com.cn/js/index.asp JS是一种轻量级的编程语言,插入html页面后可以由任何浏览器去执行,可用于 HTML 和 web,更可 ...