USACO section 3.2 Feed Ratios(高斯定理)

高斯定理的证明(三重积分的C/C++实现)(C++)(大学物理) 特别鸣谢:无私帮助我的ycc同学 #include <iostream> #include <vector> #include <random> #include <chrono> #include <corecrt_math_defines.h> struct Eletrons {//将电子的各个参量封装到一个结构体,便于访问 double x, y, z, q; }; struct Vec {//“面向对象” double x, y, 阅读详情
Feed Ratios
1998 ACM Finals, Dan Adkins

Farmer John feeds his cows only the finest mixture of cow food, which has three components: Barley, Oats, and Wheat. While he knows the precise mixture of these easily mixable grains, he can not buy that mixture! He buys three other mixtures of the three grains and then combines them to form the perfect mixture.

Given a set of integer ratios barley:oats:wheat, find a way to combine them IN INTEGER MULTIPLES to form a mix with some goal ratio x:y:z.

For example, given the goal 3:4:5 and the ratios of three mixtures:

        1:2:3
        3:7:1
        2:1:2

your program should find some minimum number of integer units (the `mixture') of the first, second, and third mixture that should be mixed together to achieve the goal ratio or print `NONE'. `Minimum number' means the sum of the three non-negative mixture integers is minimized.

For this example, you can combine eight units of mixture 1, one unit of mixture 2, and five units of mixture 3 to get seven units of the goal ratio:

    8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5)

Integers in the goal ratio and mixture ratios are all non-negative and smaller than 100 in magnitude. The number of units of each type of feed in the mixture must be less than 100. The mixture ratios are not linear combinations of each other.

PROGRAM NAME: ratios

INPUT FORMAT

 

Line 1:Three space separated integers that represent the goal ratios
Line 2..4:Each contain three space separated integers that represent the ratios of the three mixtures purchased.

SAMPLE INPUT (file ratios.in)

3 4 5
1 2 3
3 7 1
2 1 2

OUTPUT FORMAT

The output file should contain one line containing four integers or the word `NONE'. The first three integers should represent the number of units of each mixture to use to obtain the goal ratio. The fourth number should be the multiple of the goal ratio obtained by mixing the initial feed using the first three integers as mixing ratios.

SAMPLE OUTPUT (file ratios.out)

8 1 5 7


思路:用高斯消元算出配置1份目标原料所需的具体配比(这是个小数,我们用分数来表示),然后分母求最小公倍数LCM就是目标配比份额,在将其余的依次乘上LCM就是

          所需原料配比。

失误点:注意出现不够分的情况输出NONE,即是矩阵的行中出现有正有负则不可能完成配料。

 

具体代码:

/*
ID:nealgav1
LANG:C++
PROG:ratios
*/
#include<fstream>
using namespace std;
ifstream cin("ratios.in");
ofstream cout("ratios.out");
const int mm=110;
int map[mm][mm+1];
class node{public:int a,b;node(){a=0,b=1;}}ans[mm];
int var,equ;
void debug();
int gcd(int a,int b)
{ int z;
  while(b!=0)
  {
    z=b;b=a%b;a=z;
  }
  return a;
}
int lcm(int a,int b)
{
  return a*b/gcd(a,b);
}
void swap(int &a,int&b)
{
  int z;z=a;a=b;b=z;
}
int abss(int a)
{
  if(a<0)return -a;
  return a;
}
void Guss()
{ int k,col;
  for(k=0,col=0;k<var&&col<equ;k++,col++)
  {
    int i_max=k;
    for(int i=k+1;i<equ;i++)
    if(map[i][col]>i_max)i_max=i;
    if(i_max!=k)
    {
      for(int i=col;i<var+1;i++)
      swap(map[i_max][i],map[k][i]);
    }
    if(map[k][col]==0){k--;continue;}
    for(int i=k+1;i<equ;i++)
    if(map[i][col]!=0)
    {
      int LCM=lcm(abss(map[i][col]),abss(map[k][col]));
      int ta=LCM/map[i][col],tb=LCM/map[k][col];
      if(ta*tb<0)ta=-ta;
      for(int j=col;j<var+1;j++)
      map[i][j]=map[i][j]*ta-map[k][j]*tb;
      ///如果全为负数则改为正数
      if(map[i][var]<0)
      for(int j=col;j<var+1;j++)map[i][j]=-map[i][j];
    }
  }
  for(int i=k;i<equ;i++)
  if(map[i][col]==0)
  {
    cout<<"NONE\n";
    return;
  }
  ///矩阵出现是负数的说明有的不够数,所以无答案
  for(int i=0;i<equ;i++)
  {for(int j=i;j<var+1;j++)
   {
     if(map[i][j]<0){cout<<"NONE\n";return;}
   }
  }
  int LCM=1,GCD=1;
  for(int i=k-1;i>=0;i--)
  {
    node tmp;tmp.a=map[i][var];tmp.b=1;
    for(int j=i+1;j<var;j++)
    if(map[i][j])
    {
      LCM=lcm(tmp.b,ans[j].b);
      tmp.a=(LCM/tmp.b)*tmp.a-(LCM/ans[j].b)*ans[j].a*map[i][j];
      GCD=gcd(LCM,tmp.a);
      tmp.a=tmp.a/GCD;tmp.b=LCM/GCD;
    }
    ans[i].b=tmp.b*map[i][i];
    GCD=gcd(ans[i].b,tmp.a);
    ans[i].b=ans[i].b/GCD;
    ans[i].a=tmp.a/GCD;
  }
  LCM=1;
  for(int i=0;i<var;i++)
  LCM=lcm(ans[i].b,LCM);
  for(int i=0;i<var;i++)
  cout<<(LCM/ans[i].b)*ans[i].a<<" ";
  cout<<LCM<<"\n";
}
void debug()
{
  for(int i=0;i<equ;i++)
  {for(int j=0;j<var+1;j++)
   cout<<map[i][j]<<" ";
   cout<<"\n";
  }
}
int main()
{ var=equ=3;
  for(int i=0;i<3;i++)
  cin>>map[i][3];
  for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
  cin>>map[j][i];
  ///debug();
  Guss();
  cin.close();cout.close();
}


 

 

 

 

 

USER: Neal Gavin Gavin [nealgav1]
TASK: ratios
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 3408 KB]
   Test 2: TEST OK [0.000 secs, 3408 KB]
   Test 3: TEST OK [0.000 secs, 3408 KB]
   Test 4: TEST OK [0.000 secs, 3408 KB]
   Test 5: TEST OK [0.000 secs, 3408 KB]
   Test 6: TEST OK [0.000 secs, 3408 KB]

All tests OK.

YOUR PROGRAM ('ratios') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.

Here are the test data inputs:

------- test 1 ----
5 8 0
3 5 4
1 3 0
6 2 0
------- test 2 ----
3 4 5
1 2 3
3 7 1
2 1 2
------- test 3 ----
20 22 24
4 5 5
9 5 6
12 12 14
------- test 4 ----
80 85 80
98 97 96
89 87 88
78 79 80
------- test 5 ----
99 99 99
1 0 0
0 1 0
0 0 1
------- test 6 ----
93 95 97
98 0 0
0 98 0
0 0 98

Keep up the good work!

Feed Ratios
Hal Burch

As there are only 1013 = 1,030,301 ways to do this, try them all and pick the best.

#include <stdio.h>

/* the goal ratio */
int goal[3];

/* the ratio of the feeds */
int ratios[3][3];

/* the best solution found so far */
int min;
int mloc[4]; /* amounts of ratio 1, 2, and 3, and the amount of ratio 4 prod */

/* the amount of each type of component in the feed */
int sum[3];

int main(int argc, char **argv)
 {
  FILE *fout, *fin;
  int lv, lv2, lv3; /* loop variables */
  int t, s; /* temporary variables */
  int gsum; /* the sum of the amounts of components in the goal mixture */

  if ((fin = fopen("ratios.in", "r")) == NULL)
   {
    perror ("fopen fin");
    exit(1);
   }
  if ((fout = fopen("ratios.out", "w")) == NULL)
   {
    perror ("fopen fout");
    exit(1);
   }

  /* read in data */
  fscanf (fin, "%d %d %d", &goal[0], &goal[1], &goal[2]);
  for (lv = 0; lv < 3; lv++)
    fscanf (fin, "%d %d %d", ratios[lv]+0, ratios[lv]+1, ratios[lv]+2);

  gsum = goal[0] + goal[1] + goal[2];

  min = 301; /* worst than possible = infinity */

  /* boundary case (this ensures gsum != 0) */
  if (gsum == 0)
   {
    fprintf (fout, "0 0 0 0\n");
    return 0;
   }

  for (lv = 0; lv < 100; lv++)
    for (lv2 = 0; lv2 < 100; lv2++)
     { /* for each amout of the first two types of mixtures */
      sum[0] = lv*ratios[0][0] + lv2*ratios[1][0];
      sum[1] = lv*ratios[0][1] + lv2*ratios[1][1];
      sum[2] = lv*ratios[0][2] + lv2*ratios[1][2];

      if (lv + lv2 > min) break;

      for (lv3 = 0; lv3 < 100; lv3++)
       {
        s = lv + lv2 + lv3;
	if (s >= min) break; /* worse than we've found already */

        /* calculate a guess at the multiples of the goal we've obtained */
	/* use gsum so we don't have to worry about divide by zero */
        t = (sum[0] + sum[1] + sum[2]) / gsum;
	if (t != 0 && sum[0] == t*goal[0] && 
	        sum[1] == t*goal[1] && sum[2] == t*goal[2])
	 { /* we've found a better solution! */
	  /* update min */
	  min = s;

	  /* store the solution */
	  mloc[0] = lv;
	  mloc[1] = lv2;
	  mloc[2] = lv3;
	  mloc[3] = t;
	 }

        /* add another 'bucket' of feed #2 */
        sum[0] += ratios[2][0];
        sum[1] += ratios[2][1];
        sum[2] += ratios[2][2];
       }
     }
  if (min == 301) fprintf (fout, "NONE\n"); /* no solution found */
  else fprintf (fout, "%d %d %d %d\n", mloc[0], mloc[1], mloc[2], mloc[3]);
  return 0;
 }

Vlad Novakovski's Solution

When you combine multiples of mixtures, you can look at it as a multiplication of a matrix by a vector. For example, 8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5) can be seen as

[ 1 3 2 ]   [ 8 ]            
[ 2 7 1 ] * [ 1 ] = 7 [3 4 5]
[ 3 1 2 ]   [ 5 ]           

The matrix and the goal ratio vector (3:4:5 in this case) are given; what we have to find is the multiple vector (8:1:5 in this case) and the proportionality costant (7 here). This is like solving a system of linear equations. We can write it as

AX = kB.

Now, if we use Cramer's Rule, and let D = determinant of A, then

X_1 = k D_1 / D
X_2 = k D_2 / D
X_3 = k D_3 / D,

where D_1 is the determinant of the matrix A with the 1st column is replaced by B, D_2 is the determinant of the matrix A with the 2nd column is replaced by B, D_3 is the determinant of the matrix A with the 3rd column is replaced by B. (see a Linear Algebra textbook on why this works.) ,P> We are looking for integral solutions. If D = 0, no solutions. Otherwise, let k = D, and then X_1 = D_1, etc. If these values (X_1,X_2,X_3, _and_ k) all have a greatest common factor above 1, divide them all by that factor, as we are looking for the smallest possible solutions.

Now, if some of the numbers is greater than 100, we have not found a feasible solution, so we output `NONE'. Otherwise, the triple (X_1,X_2,X_3) is output, as well as the value k.

 

USACO section 3.4 Closed Fences(计算几何+叉积+二分) Closed Fences A closed fence in the plane is a set of non-crossing, connected line segments with N corners (3 i, yi}, i in (1..N). Every pair of adjacent vertices defines a side of the fence. 阅读详情

相关推荐

高斯函数和C++简单实现

高斯函数简单C++实现;

bcbobo21cn的专栏 2634

大学物理-三-----电磁学(高斯定理,电场部分)

高斯定理,场强,电势,电场中的欧姆定律,电阻率,电动势和终端电压

y江江江江的博客 1万+

基于STM32和MPU6050的手势控制小车设计与实现

MPU6050传感器:用于检测手势变化,采集加速度和陀螺仪数据。STM32微控制器:处理MPU6050传感器的数据,根据手势变化控制小车的运动。电机驱动模块:接收来自STM32的控制信号,驱动小车的电机,实现小车的前进、后退、左转和右转。小车底盘:作为整个系统的机械部分,提供移动平台。MPU6050是一款集成了3轴加速度计和3轴陀螺仪的传感器,具有高精度、低功耗和小体积等特点。它通过I2C接口与微控制器通信,可以实时采集加速度和角速度数据,广泛应用于运动检测、姿态控制和手势识别等领域。

m0_57781768的博客 2309

USACO Section 3.2 Feed Ratios (ratios)

Feed Ratios 1998 ACM Finals, Dan Adkins Farmer John feeds his cows only the finest mixture of cow food, which has three components: Barley, Oats, and Wheat. While he knows the precise mixtur...

weixin_30681121的博客 179

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

游戏资源解包神器NSCB实战:手把手教你提取Switch游戏视频(nsm转MP4)

本文详细介绍了如何使用NSCB工具链从Switch游戏中提取nsm视频和hca音频资源,并将其转换为可编辑的MP4和MP3格式。通过NSC Builder、CriPakTools等工具的分步操作指南,帮助内容创作者高效获取游戏资源,同时提供音视频同步合成、批量处理等高级技巧,为创意素材制作提供完整解决方案。

weixin_29197835的博客 889

USACO Training Section 3.2 Feed Ratios

[url="http://ace.delos.com/usacoprob2?a=JbTv7diNbha&S=ratios"]英文原题[/url] [url="http://www.wzoi.org/usaco/14%5C403.asp"]中文题译[/url] 大意:给出整数a[i][j]和b[i],i,j=1,2,3,有X={x[i]|i=1,2,3,s.t 存在y,对j=1,2...

山中竹笋 189

SARScape实战:集成GACOS数据优化InSAR大气校正全流程

本文详细介绍了如何在SARScape软件中集成GACOS数据,以优化InSAR大气校正的全流程。通过实战步骤,从GACOS数据申请、下载、导入,到在单景干涉图和SBAS-InSAR流程中应用,有效剥离大气相位延迟,显著提升形变监测结果的精度与可靠性,实现从“雾里看花”到“拨云见日”的转变。

weixin_28419039的博客 401

USACO Section 3.2 Feed Ratios(解三元一次方程)

Feed Ratios1998 ACM Finals, Dan Adkins Farmer John feeds his cows only the finest mixture of cow food, which has three components: Barley, Oats, and Wheat. While he knows the precise mixture of ...

angtongyou1893的博客 201

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 539

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1073

USACO section 3.1 Contact(AC自动机)

Contact IOI'98 The cows have developed a new interest in scanning the universe outside their farm with radiotelescopes. Recently, they noticed a very curious microwave pulsing emission sent right f

nealgavin的专栏 9384

allegro如何设置走线等长

设置走线等长!

weixin_42499230的博客 6934

USCAO section 1.3 Calf Flac

Calf Flac It is said that if you give an infinite number of cows an infinite number of heavy-duty laptops (with very large keys), that they will ultimately produce all the world's great palindromes

nealgavin的专栏 6656

MIPI D-PHY IP 使用说明(一)

目录 前言 一、IP 特点 二、IP 可用性 三、IP 总览 四、IP 声明 五、IP 结构 六、IP 分流桥 模式 七、端口描述 1、PPI 接口信号 1、常规 PPI控制信号 2、发送模式 时钟通道 高速 PPI 信号 3、发送模式 时钟通道 逃逸模式PPI 信号 4、发送模式 数据通道 高速 PPI 信号 5、发送模式 数据通道 控制接口PPI 信号 6、发送模式 ...

记录所学,分享知识,结识挚友 2504

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

USACO section 1.5 Checker Challenge(dfs深搜)

Checker ChallengeExamine the 6x6 checkerboard below and note that the six checkers are arranged on the board so that one and only one is placed in each row and each column, and there is never more tha

nealgavin的专栏 1923

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

USACO section 2.3 Longest Prefix(dp)

Longest Prefix IOI'96 The structure of some biological objects is represented by the sequence of their constituents, where each part is denote by an uppercase letter. Biologists are interested in

nealgavin的专栏 1486

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

USACO section 2.4 Cow Tours(并查集+最短路)

Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with certain other pastures, forming a field. But, at the present time, you can find at least two pasture

nealgavin的专栏 1405

USACO section3.1 Shaping Regions(漂浮法)

Shaping Regions N opaque rectangles (1 <= N <= 1000) of various colors are placed on a white sheet of paper whose size is A wide by B long. The rectangles are put with their sides parallel to the s

nealgavin的专栏 1052

USACO section 2.2 Runaround Numbers

Runaround Numbers Runaround numbers are integers with unique digits, none of which is zero (e.g., 81362) that also have an interesting property, exemplified by this demonstration: If you start

nealgavin的专栏 989

USACO section 3.1 Stamps(dp)

Stamps Given a set of N stamp values (e.g., {1 cent, 3 cents}) and an upper limit K to the number of stamps that can fit on an envelope, calculate the largest unbroken list of postages from 1 cent

nealgavin的专栏 980

USCAO section 4.1 Fence Loops(最短路,最小环,5级)

Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of control. They are made up of straight segments from 1 through 200 feet long that join together only a

nealgavin的专栏 941

USACO section 1.5 Superprime Rib(深搜)

Superprime RibButchering Farmer John's cows always yields the best prime rib. You can tell prime ribs by looking at the digits lovingly stamped across them, one by one, by FJ and the USDA. Farmer John

nealgavin的专栏 937

USACO section 2.2 Party Lamps

Party Lamps IOI 98 To brighten up the gala dinner of the IOI'98 we have a set of N (10 <= N <= 100) colored lamps numbered from 1 to N. The lamps are connected to four buttons: Button 1: Wh

nealgavin的专栏 913

USACO section 3.2 Spinning Wheels(模拟)

Spinning Wheels 1998 ACM NE Regionals Each of five opaque spinning wheels has one or more wedges cut out of its edges. These wedges must be aligned quickly and correctly. Each wheel also has an ali

nealgavin的专栏 875
上一篇: USACO section 3.2 Spinning Wheels(模拟)
下一篇: USACO section 3.2 Magic Squares(STL+广搜)
剑不飞
博客等级 码龄15年 86粉丝 505原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值