【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 ...
随机推荐
- C++学习之容器的摸索
初学容器,容易犯错的地方 1.vector,list和deque都是顺序容器.其中vector和deque都可以通过下标访问,而list不能 2. 容器的begin和end操作 c.begin()返回 ...
- (转载)PHP静态方法
(转载)Lamp兄弟连PHP 6.静态方法(static修饰的方法),不能访问非静态成员(在非静态的方法中,可以访问静态成员).因为非静态的成员,就必须用对象来访问,访问内部的成员使用的就是$this ...
- 线性规划||网络流(费用流):COGS 288. [NOI2008] 志愿者招募
[NOI2008] 志愿者招募 输入文件:employee.in 输出文件:employee.out 简单对比 时间限制:2 s 内存限制:512 MB [问题描述] 申奥成功后,布布经过 ...
- 图论(差分约束系统):POJ 1275 Cashier Employment
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7651 Accepted: 288 ...
- 在kafka上对topic新增partition
对topic增加partition 参考官网site:http://kafka.apache.org/documentation.html#basic_ops_modify_topic 通过kafka ...
- iOS 用CocoaPods做iOS程序的依赖管理
文档更新说明 2012-12-02 v1.0 初稿 2014-01-08 v1.1 增加设置 ruby 淘宝源相关内容 2014-05-25 v2.0 增加国内 spec 镜像.使用私有 pod.po ...
- libvirt基于安装
- composer安装第三方库
生成composer.json 首先需要安装composer,composer -v出现如下,则表明安装成功. 编写composer.json { "name": "ww ...
- Redis 实现用户积分排行榜
排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如“用户积分榜”.如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对 ...
- Android RelativeLayout 布局android:layout_centerHorizontal="true"注意
特别注意,如果要是 android:layout_alignTop="@id/bind_decode_item_layout" android:layout_centerHoriz ...