优化程序的思维(C++)

194 阅读1分钟

题目分析:

一百铜钱可以买一百只鸡。一只公鸡,5美元,一只母鸡,3美元,3个小的。一百只公鸡,母鸡,鸡,多少只?

分析:

way one:

我们直接三层暴力循环,因为不可能超过100只的同种鸡,那么三层循环,每层100次

PS:时间复杂度太高了,我们需要进一步优化

way two:

由于公鸡5元,那么不可能买20只公鸡,则公鸡循环层为20,同理,母鸡3元,循环层为33,小鸡就使其循环层为100

PS:循环次数下降了不少,但是有没有进一步的优化呢

way three:

我们有这两个方程组:

x+y+z=100------(1)        5x+3y+z/3=100------(2)

消去z后可得:7x+4y=100,进一步得:y=25-7x/4(x可取0,4,8,12)(因为y为整数)

那么,循环只用四次即可

代码如下:

#include <iostream>
#include <Windows.h>
using namespace std;

int main() {
	LARGE_INTEGER freq, start, end;
	QueryPerformanceFrequency(&freq);
	cout << freq.QuadPart << endl;

	int count;
	//方法1:
	QueryPerformanceCounter(&start);
	count = 0;
	cout << "方法1:" << endl;
	for (int cock = 0; cock < 100; cock++) {
		for (int hen = 0; hen < 100; hen++) {
			for (int chick = 0; chick < 100; chick += 3) {
				count++;
				if (((cock + hen + chick) == 100) && ((5 * cock + 3 * hen + chick / 3) == 100)) {
					cout << cock << "," << hen << "," << chick << endl;
				}
			}
		}

	}
	cout << "Count:" << count << endl;
	QueryPerformanceCounter(&end);
	cout << "Duration:" << end.QuadPart - start.QuadPart << endl;

	//方法2:
	QueryPerformanceCounter(&start);
	count = 0;
	cout << "方法2:" << endl;
	for (int cock = 0; cock < 20; cock++) {
		for (int hen = 0; hen < 33; hen++) {
			for (int chick = 0; chick < 100; chick += 3) {
				count++;
				if (((cock + hen + chick) == 100) && ((5 * cock + 3 * hen + chick / 3) == 100)) {
					cout << cock << "," << hen << "," << chick << endl;
				}
			}
		}

	}
	cout << "Count:" << count << endl;
	QueryPerformanceCounter(&end);
	cout << "Duration:" << end.QuadPart - start.QuadPart << endl;

	//方法3:
	QueryPerformanceCounter(&start);
	count = 0;
	cout << "方法3:" << endl;
	for (int cock = 0; cock < 16; cock += 4) {
		count++;
		int hen = 25 - 7 * cock / 4;
		int chick = 100 - cock - hen;
		cout << cock << "," << hen << "," << chick << endl;
	}
	cout << "Count:" << count << endl;
	QueryPerformanceCounter(&end);
	cout << "Duration:" << end.QuadPart - start.QuadPart << endl;

	cout << endl;
}