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

直接高斯消元解方程组,枚举最后一列的倍数(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. NGUI学习笔记汇总

    NGUI学习笔记汇总,适用于NGUI2.x,NGUI3.x 一.NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加 ...

  2. TIF、JPG图片手动添加地理坐标的方法(转载)

    题目:为TIF.JPG图片添加地理坐标/平面直角坐标. 图片来源:GOOGLE EARTH.(当然也可以是其他知道四角点坐标的图片) 截图工具:GEtscreen(此软件截图时可以自动生成图片四角点坐 ...

  3. Gvim使用

    VIM删除空白行 命令:g/^\s*$/d :g 代表在全文档范围内 ^代表行的开始 \s*代表空白字符 &代表行的结束 d代表删除 用//将3段代码隔开

  4. WPF使用cefsharp

    最近在公司项目上会用到cefsharp.wpf,不知道为什么按照网上的配置一直无法运行成功,怎么配置可以参考以下这篇博文: http://www.cnblogs.com/TianFang/p/4573 ...

  5. Go Walk教程 - 流程控制( switch)

    Go的 switch 非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项,不要break: var score =98 var result string switch score/ ...

  6. SVM+HOG特征训练分类器

    #1,概念 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析. SVM的主要思想可以概括为两点:⑴它是针 ...

  7. 20135306黄韧[2.72 2.77 3.70](http://i.cnblogs.com/EditPosts.aspx?opt=1)

    2.72 A.size_t是无符号整数,因此左边都会先转换为无符号整数,它肯定是大于等于0的. B.判断条件改为 if(maxbytes > 0 && maxbytes > ...

  8. 如何启动一个已经创建的docker 容器,并进入SHELL 对其操作

    腾讯云使用自己的docker镜像安装后无法启动,下边这个亲测是可用的 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A ...

  9. IT男的”幸福”生活"续3

    我和MM一进饭店,服务员走过,面带笑容,说:“欢迎,欢迎,两位里面坐.” ...... 谢谢大家的捧场,IT的”幸福”生活.是我的回忆录来着.真实可靠,在写法上有点小说化.可能是我一直看小说的原因吧, ...

  10. word删除水平线(分割线)的方法(原创)

    在word里面,有时候我们会输入3个“-”或者“=”等符合,然后一个回车,生成了一条水平线(分割线). 研究了很久,今天终于发现删除它的方法了. 选中文本,点“格式”,选中“边框和底线”,点第一个子页 ...