东华进阶题64 饲料调配

64 饲料调配

作者: xxx时间限制: 2S章节: 二维数组

问题描述 :

农夫约翰从来只用调配得最好的饲料来为他的奶牛。

饲料用三种原料调配成:大麦,燕麦和小麦。他知道自己的饲料精确的配比,在市场上是买不到这样的饲料的。他只好购买其他三种混合饲料(同样都由三种麦子组成),然后将它们混合,来调配他的完美饲料。

给出三组整数,表示 大麦:燕麦:小麦 的比例,找出用这三种饲料调配 x:y:z 的饲料的方法。

例如,给出目标饲料 3:4:5 和三种饲料的比例:

1:2:3

3:7:1

2:1:2

你必须编程找出使这三种饲料用量最少的方案,要是不能用这三种饲料调配目标饲料,输出’NONE’。'用量最少’意味着三种饲料的用量(整数)的和必须最小。

对于上面的例子,你可以用8份饲料1,2份饲料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。一种混合物的比例不会由其他混合物的比例直接相加得到。

输入说明 :

Line 1: 三个用空格分开的整数,表示目标饲料

Line 2…4: 每行包括三个用空格分开的整数,表示农夫约翰买进的饲料的比例

输出说明 :

输出文件要包括一行,这一行要么有四个整数,要么是’NONE’。前三个整数表示三种饲料的份数,用这样的配比可以得到目标饲料。第四个整数表示混合前三种饲料后得到的目标饲料的份数。

输入范例 :

3 4 5
1 2 3
3 7 1
2 1 2
输出范例 :

8 1 5 7

#include <stdio.h>
int main() {
	int x,y,z;
	while(scanf("%d%d%d",&x,&y,&z)!=EOF) {
		int a[3];//第一份饲料
		int b[3];//第二份饲料
		int c[3];//第三份饲料
		int store[100][4];//存储总和  与饲料比
		int count=0;
		int i,j,k;
		scanf("%d%d%d",&a[0],&a[1],&a[2]);
		scanf("%d%d%d",&b[0],&b[1],&b[2]);
		scanf("%d%d%d",&c[0],&c[1],&c[2]);
		int flag=0;
		int biaozhi=0;
		for(i=0; i<100; i++) {
			for(j=0; j<100; j++)
				for(k=0; k<100; k++) {
					if(i==0&&(j==0&&k==0)) {
						continue;
					}
					if(x!=0&&(i*a[0]+j*b[0]+k*c[0])%x==0) {
						if(y!=0&&(i*a[1]+j*b[1]+k*c[1])%y==0) {
							if(z!=0&&(i*a[2]+j*b[2]+k*c[2])%z==0) {
								if((i*a[0]+j*b[0]+k*c[0])/x==(i*a[1]+j*b[1]+k*c[1])/y&&(i*a[1]+j*b[1]+k*c[1])/y==(i*a[2]+j*b[2]+k*c[2])/z)
									biaozhi=1;
								if(biaozhi==1) {
									int sum=i+j+k;
									store[count][0]=sum;
									store[count][1]=i;
									store[count][2]=j;
									store[count++][3]=k;
									flag=1;
									biaozhi=0;
								}
							} else if(z==0) {
								//z==0
								if((i*a[0]+j*b[0]+k*c[0])%x==0) {
									if((i*a[1]+j*b[1]+k*c[1])%y==0) {
										if((i*a[2]+j*b[2]+k*c[2])==0)
											if((i*a[0]+j*b[0]+k*c[0])/x==(i*a[1]+j*b[1]+k*c[1])/y)
												biaozhi=1;
										if(biaozhi==1) {
											int sum=i+j+k;
											store[count][0]=sum;
											store[count][1]=i;
											store[count][2]=j;
											store[count++][3]=k;
											flag=1;
											biaozhi=0;
										}
									}
								}

							}
						}
					}
				}
		}
		if(flag==0) {
			printf("NONE\n");
			continue;
		}
		int index=0;
		for(i=1; i<count; i++)
			if(store[i][0]<store[index][0])
				index=i;
		int fenshu=(store[index][1]*a[0]+store[index][2]*b[0]+store[index][3]*c[0])/x;
		printf("%d %d %d %d\n",store[index][1],store[index][2],store[index][3],fenshu);
	}
	return 0;
}

题目可以AC了,还有部分情况为0实在是不想编写了,太呕心了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值