【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 ...
随机推荐
- bzoj2096
本来也不打算写这道题的解题报告的,因为比较水直接维护两个单调队列(最大值,最小值)随便弄弄就行了但是我开始疯狂不知道为什么的RE,然后实在没办法找root要了数据测了之后……王苍,根本就没有错啊……我 ...
- hiho #1079 : 离散化
描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报 ...
- 【Angular】排序
Correct way to integrate Jquery plugins in Angular.js gaurav123337/AngularOtherJqueryPluginDemo 超强的拖 ...
- 自己做的网页页面导航浏览JS/JQuery
需求: 当页面是由一个巨大的表格构成时,浏览器自动会出现纵向和横向滚动条,这时用户浏览页面会出现很蛋疼的感受,那就是恶心的横向滚动条! 为了减缓这种蛋疼的感觉,我尝试做了这个导航器(不知道如何称呼), ...
- CodeForces 689C Mike and Chocolate Thieves
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=412145 题目大意:给定一个数字n,问能不能求得一个最小的整 ...
- 在Ubuntu中安装Redis
原文地址:http://blog.fens.me/linux-redis-install/ 在Ubuntu中安装Redis R利剑NoSQL系列文章,主要介绍通过R语言连接使用nosql数据库.涉及的 ...
- poj3261 Milk Patterns(后缀数组)
[题目链接] http://poj.org/problem?id=3261 [题意] 至少出现k次的可重叠最长子串. [思路] 二分长度+划分height,然后判断是否存在一组的数目不小于k即可. 需 ...
- maven src/test/resources 下的logback-test.xml 读取 properties文件中的key-value值
<profiles> <profile> <id>test-cd</id> <prope ...
- Android应用开发学习之画廊视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 画廊视图Gallery能按水平方向显示一组图片,并可以拖动图片.下面我们来看一个使用画廊视图的例子,其运行效果如下: ...
- Hadoop入门--HDFS(单节点)配置和部署 (一)
一 配置SSH 下载ssh服务端和客户端 sudo apt-get install openssh-server openssh-client 验证是否安装成功 ssh username@192.16 ...