【USACO 3.2.4】饲料调配
【描述】
农夫约翰从来只用调配得最好的饲料来喂他的奶牛。饲料用三种原料调配成:大麦,燕麦和小麦。他知道自己的饲料精确的配比,在市场上是买不到这样的饲料的。他只好购买其他三种混合饲料(同样都由三种麦子组成),然后将它们混合,来调配他的完美饲料。
给出三组整数,表示 大麦:燕麦:小麦 的比例,找出用这三种饲料调配 x:y:z 的饲料的方法。
例如,给出目标饲料 3:4:5 和三种饲料的比例:
1:2:3
3:7:1
2:1:2
你必须编程找出使这三种饲料用量最少的方案,要是不能用这三种饲料调配目标饲料,输出“NONE”。“用量最少”意味着三种饲料的用量(整数)的和必须最小。
对于上面的例子,你可以用8份饲料1,1份饲料2,和5份饲料3,来得到7份目标饲料:
8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5)
表示饲料比例的整数以及目标饲料的都是小于100的非负整数。表示各种饲料的份数的整数,都小于100。一种混合物的比例不会由其他混合物的比例直接相加得到。
【格式】
PROGRAM NAME: ratios
INPUT FORMAT:
(file ratios.in)
Line 1: 三个用空格分开的整数,表示目标饲料
Line 2..4: 每行包括三个用空格分开的整数,表示农夫约翰买进的饲料的比例
OUTPUT FORMAT:
(file ratios.out)
输出文件要包括一行,这一行要么有四个整数,要么是“NONE”。前三个整数表示三种饲料的份数,用这样的配比可以得到目标饲料。第四个整数表示混合三种饲料后得到的目标饲料的份数。
【分析】
可以用枚举,不会超时,但是会很慢。
这里给出用高斯消元的做法,枚举目标量。然后判断是否有解就行了。
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <fstream>
using namespace std;
int data[][];
int A[][];//求解
void init(int num);
int gauss(int n);//高斯消元
void debug();
int gcd(int a,int b){return b==?a:gcd(b,a%b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
int main()
{
int i;
//文件操作
freopen("ratios.in","r",stdin);
freopen("ratios.out","w",stdout);
memset(data,,sizeof(data));
//输入数据
scanf("%d%d%d",&data[][],&data[][],&data[][]);
for (i=;i<;i++) scanf("%d%d%d",&data[i][],&data[i][],&data[i][]);
for (i=;i<=;i++)
{
init(i);//初始化
if (gauss(i)) return ;
}
printf("NONE");
return ;
}
void init(int num)
{
int i,j;
for (i=;i<;i++)//行列
for (j=;j<;j++) A[i][j]=data[j][i];
A[][]=data[][]*num;
A[][]=data[][]*num;
A[][]=data[][]*num; }
void debug()//调试
{
int i,j;
for (i=;i<;i++)
{
for (j=;j<;j++) printf("%d ",A[i][j]);
printf("\n");
}
printf("\n");
}
int gauss(int m)
{
int i=,j=,k,l,r,tmp,tmp1,tmp2,ans[];
memset(ans,,sizeof(ans));
while((i<)&&(j<))//i是行数,j当前需要消除的行数
{
r=i;//绝对值最大
for(k=i+;k<;k++) if(A[k][j]>A[i][j]) r=k;
if (r!=i) for(k=;k<;k++) swap(A[i][k],A[r][k]); if(A[i][j]!=)
{
for(l=i+;l<;l++)
if(A[l][j]!=)
{
tmp=lcm(abs(A[l][j]),abs(A[i][j]));
tmp1=tmp/A[i][j];
tmp2=tmp/A[l][j];
for(k=j;k<;k++) A[l][k]=A[l][k]*tmp2-A[i][k]*tmp1;
}
i++;//行数
}
j++;
}
//debug();
if(i==)
{
for(i=;i>=;i--)
{
tmp=;
for(j=i+;j<;j++) tmp+=A[i][j]*ans[j]; if((A[i][]-tmp)%A[i][i]!=) return false;
ans[i]=(A[i][]-tmp)/A[i][i];
} if((ans[]<) || (ans[]<) || (ans[]<)) return ;//只要
printf("%d %d %d %d\n",ans[],ans[],ans[],m);
return ;
}
else return ;
}
【USACO 3.2.4】饲料调配的更多相关文章
- 洛谷P2729 饲料调配 Feed Ratios
P2729 饲料调配 Feed Ratios 36通过 103提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 农夫约翰从来只用调 ...
- 【USACO】又买饲料 单调队列dp
题目描述 约翰开车回家,又准备顺路买点饲料了(咦?为啥要说“又”字?)回家的路程一共有 E 公里, 这一路上会经过 N 家商店,第 i 家店里有 F i 吨饲料,售价为每吨 C i 元.约翰打算买 K ...
- NKOJ1828 Feed Ratios饲料调配
题目 好题!高斯消元切了! (其实只是单纯地想吐槽这道出现在"高斯消元"专练里的题,暴搜能过,goudoubuxie"Gauss") 下面是暴搜: #pragm ...
- goose消元
ps.改了标题 魔板 思路:按序消除变量,用当前行(i)[行i消\(x_i\)元素],消后面的每一行的i元素 最后按逆序回代值 注意若有i~n行i元素系数都为0说明没有唯一解(其余x的解跟i元素有关) ...
- usaco 购买饲料 && 修剪草坪
购买饲料 Description 如约翰在镇上,沿着公路开车回家,他的家离起点有E公里.他顺便准备买K吨饲料回家.运送饲料是要花油钱的,如果他的车上有X吨饲料,行驶一公里需要X^2元,行驶D公里就 需 ...
- usaco silver
大神们都在刷usaco,我也来水一水 1606: [Usaco2008 Dec]Hay For Sale 购买干草 裸背包 1607: [Usaco2008 Dec]Patting Heads 轻 ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II 洛谷传送门 JDOJ 2671: USACO 2010 Jan Silver 2.Buying Feed, II ...
- USACO . Your Ride Is Here
Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often co ...
随机推荐
- 线性代数(高斯消元):JSOI2008 球形空间产生器sphere
JSOI2008 球形空间产生器sphere [题目描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确 ...
- 生成树的计数(基尔霍夫矩阵):UVAoj 10766 Organising the Organisation SPOJ HIGH - Highways
HIGH - Highways In some countries building highways takes a lot of time... Maybe that's because th ...
- 线性规划||网络流(费用流):COGS 288. [NOI2008] 志愿者招募
[NOI2008] 志愿者招募 输入文件:employee.in 输出文件:employee.out 简单对比 时间限制:2 s 内存限制:512 MB [问题描述] 申奥成功后,布布经过 ...
- 动态规划——H 最少回文串
We say a sequence of characters is a palindrome if it is the same written forwards and backwards. Fo ...
- UVA 11922 Permutation Transformer(Splay Tree)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 [思路] 伸展树+打标记. 用伸展树维护这个序列,使得能 ...
- POJ3617 Best Cow Line
其实是学习参考了算法书的代码,但仍然是我自己写的,有小差别.贪心类型. #include <iostream> using namespace std; int main() { int ...
- 纠结的CLI C++与Native C++的交互
最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊. 交互原型 交互原型是这样的: void* avio_alloc_context( un ...
- 【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack
最近在模拟HTTP请求抓取数据,但是服务器是asp.net开发的 分页控件代码 <tr> <td align="left">共 210&am ...
- struts2入门程序
struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...
- [yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程
本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...