USACO 3.2 ratios 高斯消元
题目原意很简单,就是解一个三元一次方程组
直接高斯消元解方程组,枚举最后一列的倍数(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 高斯消元的更多相关文章
- BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- POJ 3185 The Water Bowls 【一维开关问题 高斯消元】
任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS Memory Limit: 65536K Total S ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
随机推荐
- 使用appscan实现多站扫描简单自动化
因为appscan在新建扫描任务的时候只能输入一个target,并且没有awvs/nessus那样提供web接口,导致我以前一直以为appscan不能像awvs那样批量建立任务自动扫描. 不过,今天要 ...
- mac 无法连接android手机进行调试 解决方案
第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType 可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): Android: ...
- Windows Phone:自定义字体在xaml和代码中使用
最近,我的小应用<认字>更新了一个能发声的版本,朋友对Speech做读音没有兴趣,反而对其中使用的楷体文字表示了兴趣,也许Speech的文章比较多,这次我对这个自定义字体在xaml和代码中 ...
- Runtime类及其常用方法
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.可以通过 getRuntime 方法获取当前运行时. 常用方法: 1.public static Runt ...
- android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类)
在使用android-async-http的时候我的apl 更新到了23,我的build version也是23的时候出现了,org.apache.http.Header这个类找不到的情况,原因是在a ...
- Bootstrap 排版
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...
- .NET跨平台之OWEN中 过滤器的使用
.NET中依赖IIS,通俗的说就是依赖IIS的程序集,导致我们的.NET项目就算是MONO到TOMCAT上,也无法使用,所以OWEN横空出世,OWEN定义了一套接口,接口定义了做.NET项目要实现的一 ...
- 设置 git/npm/bower/pip/gem镜像或代理
git 设置: $ git config --global http.proxy http://proxy.mysite.com 取消: $ git config --global --unset h ...
- I belonged to you
小葫芦,你就像山间清爽的风,犹如古城温暖的光,在我的旅途中陪伴着我. 我想牵着你的手,踏遍万水千山,赏遍美景风光,春观夜樱,夏望繁星,秋赏满月,冬会初雪. 直到两鬓斑白,一起坐在火炉旁,给孩子们讲故事 ...
- linux网络命令
关键字 write wall last lastlog traceroute netstat mount 1.write 该命令可以给所有在线用户发送消息 示例: 接受消息用户:按回车可以退出 2.w ...