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 ...
随机推荐
- IO流的练习1 —— 随机获取文本中的信息
需求:一个文本中有几个名字,随机从中获取一个名字 分析: A:首先把文本中的数据读出 B:再把数据存储到集合中 C:产生一个随机的索引 D:打印出这个索引对应的值 public static void ...
- java11-1 最常见的类 String类
字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. 通过查看API,可以知道 A:字符串字面值"abc"也可以看成是一个字符串对象. B:字符串是常量,一旦被赋值,就 ...
- SpringMVC 初始化网站静态信息
在网站开发中,一些元素经常被访问,例如 网页头部URL导航 的信息,以及Boot版权的信息,在各个页面都是重复出现的 如果每次渲染View都要通过Service层访问数据库 比较麻烦 也没有必要,但是 ...
- 25个实用的jquery技巧
1. 去除页面的右键菜单 $(document).ready(function(){ $(document).bind(“contextmenu”,function(e){returnfalse; ...
- 16Mybatis_动态sql_if判断
mybatis的核心就是动态sql. 什么是动态sql:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 这篇文章讲解sql中的if语句.它可以对查询条件进行判断,如果输入参 ...
- Windows客户端C/C++编程规范“建议”——风格
本文来自:http://blog.csdn.net/breaksoftware/article/details/37935459 命名风格也非常适用于C# 9 风格 9.1 优先使用匈牙利命名法 等级 ...
- .net程序集强命名(签名)
要想得到强签名的dll有两种情况: 1.给项目添加强命名 在你的项目右键->属性->签名,勾选“为程序集签名”,新建 或 浏览已经新建过的.pfx文件,然后重新build项目,生成的dll ...
- XXOOJL
她的鞋子放在外面没拿进来很显眼,我们俩正抱在床上,刚做完什么也没穿,她也没擦.听到门外的脚步声.赶紧穿.她在我房间里没出声,但我父亲肯定看出来了.于是问我:母亲去哪了,然后他去找她. 太尴尬了,那晚我 ...
- 史上最全Html与CSS布局技巧
单列布局水平居中水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元素的父 ...
- 使用ajax跨域withCredentials的作用
默认情况下,跨源请求不提供凭据(cookie.HTTP认证及客户端SSL证明等).通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据.如果服务器接收带凭据的请求,会用 ...