大秦的困境

首先是一道和秦国没有任何关系的题目。
说有一匹聪明的骡子,它没走1里路就要吃1根胡萝卜,它只能驮1000根胡萝卜。
很明显,1000里以内的区域,骡子想要去多远的地方就带多少胡萝卜就行(不考虑回来),现在第一个问题时,它要去1200里外的地方怎么办?
有一个办法,它先驮着1000根胡萝卜出发到200里以外的驿站,此时还剩800根胡萝卜,卸下600根,带着200根胡萝卜回程,到出发地,带着600根胡萝卜出发,到达临时点后,还剩400根,带着暂存的600根胡萝卜,就能到达1200里以外的地区了。
现在问题升级,骡子现在有3000根胡萝卜,它最多能到达多远的地方?
答案是200+333+1000里,先运3次,往+返5次,把2000根胡萝卜运到200里外,共消耗1000根胡萝卜,然后在运2次,往+返3次,把1000根胡萝卜运到200+333里外,然后再带着1000根萝卜出行。
又一次问题出现,现在骡子要去2000里外的,地方,要准备多少胡萝卜?
1000+(1000/3)+(1000/5)+(1000/7)+…>=2000;答案是7690根胡萝卜;
又问3000里,4000里呢?
现在列出一下算法:
(每次前进至少1里)

package simple.guzy.test.test;

public class Test0117 {

	public static void main(String[] args) {
		int 总路程 = 2000;
		int lllll = 总路程;
		int d = 0;
		int ll = 0;
		int[] lens = new int[10000];
		int[] cishus = new int[10000];
		int 运多少胡萝卜 = 0;
		int[] yunduoshao = new int[10000];
		for(int i = 1; i<=10000;i++) {
			yunduoshao[i-1] = 运多少胡萝卜;
			int cishu = (int) (1+ Math.ceil((运多少胡萝卜+0.0)/1000));
			int d1 = (int) Math.floor(1000.0/(2*cishu-1));
			if(d1==0) {
				d1 = 1;
			}
			d1=d1==1000?1000:1;//**每次前进1里时,能够前进更远的路**
		    cishu = (long) Math.ceil( (运多少胡萝卜 - d1+0.0)/(1000.0-2*d1) );//当数目大时,不准确
		    cishu = 运多少胡萝卜==0?1:((运多少胡萝卜 - d1+1000-2*d1-1)/(1000-2*d1)) ;
			lens[i-1] = d1;
			cishus[i-1] = cishu;
			d+= d1;
			运多少胡萝卜 += d1*(2*cishu-1);
			if(d>=lllll) {
				ll = i;
				break;
			}
		}
		System.out.println("ll:::"+ll);
		int lastL = 总路程;
		for (int i = 0; i < ll-1; i++) {
			lastL -= lens[i];
		}
		lens[ll-1] = lastL;
		System.out.println("lastL---"+lens[ll-1]);
		int 胡萝卜 = 0;
		int xuyao[] = new int[ll];
		for (int i = 0; i < ll; i++) {
			xuyao[i] = 胡萝卜;
			胡萝卜 += (lens[i]*(2*cishus[i]-1));
		}
		int 路程 = 0;
		胡萝卜 = 0;
		for (int i = 0; i < ll; i++) {
			System.out.println("第"+(i+1)+"次:前进:"+lens[ll-i-1]+"公里,往返"+cishus[ll-i-1]+"次,共使用"+lens[ll-i-1]+"*"+(2*cishus[ll-i-1]-1)+"="+(lens[ll-i-1]*(2*cishus[ll-i-1]-1))+"根胡萝卜");
			int nengyun = ((1000-lens[ll-i-1])*cishus[ll-i-1]-lens[ll-i-1]*(cishus[ll-i-1]-1));
			int xuyaoyun = xuyao[ll-1-i];
			System.out.println("能运"+nengyun+"胡萝卜,"+"需要运"+xuyaoyun+"胡萝卜"+yunduoshao[ll-i-1]);
			if(nengyun<xuyaoyun) {
				System.out.println("能运不足需要");
				return;
			}
			if(nengyun-xuyaoyun>1000) {
				System.out.println("运多了");
				//return;
			}
			路程 += lens[ll-i-1];
			胡萝卜 += (lens[ll-i-1]*(2*cishus[ll-i-1]-1));
		}
		System.out.println("共前进"+路程+"公里,共食用"+胡萝卜+"胡萝卜");
	}
}

2000里是7690根胡萝卜
3000里是57856根胡萝卜
4000里是430242根胡萝卜
5000里是3185460根胡萝卜
6000里是23584734根胡萝卜
7000里是174618278根胡萝卜
8000里是1292850798根胡萝卜
9000里是9572097598根胡萝卜
10000里是70870554370根胡萝卜
每多前进1000里,基本快要增加10倍的胡萝卜,计算9000和10000里的时候,已经不得不用long类型了。
有同事问我,算这有什么用呢?对呢,有什么用呢,我纯粹只是为了解答而解答啊,晚上我突然想到,这不就是大秦的困局所在吗?
战国时期,秦国每次出征路途都不会很远,所以运输压力不大,但是等到统一全国之后呢?版图前所未有,但是政策却没有改变,还是人人服役,修建长城,但是长城附近并没有产粮区,要把关中关东(历史只是普通爱好者不研究,所以不严谨)的粮食运到长城,1吨粮食又有多少能运到,百姓的压力徒增啊!
秦之亡,亡其大也!

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/86530256