programming-challenges Shoemaker's Problem (110405) 题解

原创 2015年07月07日 15:29:52

Greedy. 


证明:

Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., tn, fn

and they are in the order of t1/f1 <= t2/f2 <= t3/f3 <= ... <= tn/fn

So this is the objective schedule. Now we change 1 with m (1 < m <= n)

By the original order, we need pay fine as much as: F1 = t1 * (f2 + ... + fn) + t2 * (f3 + ... + fn) + ... + tm * (fm+1 + ... + fn) + R

By the new order, we need pay fine as much as: F2 = tm * (f1 + ... + fm-1 + fm+1 + ... + fn) + t1 * (f2 + ... + fm-1 + fm+1 + ... + fn) + ... + fm-1 * fm+1 + ... + fn) + R

F1 - F2 = (t1 + t2 + ... + tm-1) * fm - (tm * f1 + tm * f2 + ... + tm * fm-1)

As t1 * fm <= tm * f1, t2 * fm <= tm * f2, ..., tm-1 * fm <= tm * fm-1 F1 - F2 <= 0

So the original order is the best order.


#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <assert.h>
#include <algorithm>
#include <math.h>
#include <ctime>
#include <functional>
#include <string.h>
#include <stdio.h>
#include <numeric>
#include <float.h>

using namespace std;



/*
4.6.5
*/

struct Rec {
	int time, cost, id; 
	Rec(int atime, int acost, int aid) : time(atime), cost(acost), id(aid) {}
};

bool camp(Rec r1, Rec r2) {
	return r1.time * r2.cost < r1.cost * r2.time;
}

int main() {
	int TC = 0; cin >> TC;
	bool blank = false;
	for (int tc = 1; tc <= TC; tc++) {
		int num = 0; cin >> num; 
		vector<Rec> recs; 
		for (int i = 0; i < num; i++) {
			int time, cost; cin >> time >> cost;
			recs.push_back(Rec(time, cost, i + 1)); 
		}

		stable_sort(recs.begin(), recs.end(), camp); 

		if (blank) {
			cout << endl; 
		}
		blank = true;
		for (int i = 0; i < recs.size(); i++) {
			if (i > 0) cout << " ";
			cout << recs[i].id;
		}
		cout << endl; 
	}
	return 0; 
}


programming-challenges Adventures in Moving - Part IV (111108) 题解

解题的思路网上有很多文章。我犯的一个错误在于没有卡住油箱的上限只能是200,而用了一个更大一点的边界210,结果算出来的结果是更优的。代码写的不好,不过也懒得整理了。dp这一章的题目都ac了。 #i...

programming-challenges Automated Judge Script (110305) 题解

#include #include #include #include #include #include #include #include #include #include ...

programming-challenges ShellSort (110407) 题解

在programming challenges上没有ac,只在UVA上ac了。不过看了看别人的思路,至少思路上是没问题的。 #include #include #include #includ...

programming-challenges Longest Nap (110404) 题解

One thing to note, the items in the schedule list may not be given in the order of timeline. Here is...

programming-challenges Contest Scoreboard (110207) 题解

建立数据结构然后排序。第一次提交又犯了一个愚蠢的小错误。想想构造好的测试用例的能力也挺重要的。 #include #include #include #include #include #...

programming-challenges Crypt Kicker (110204) 题解

我的解答,但是复杂度不是很满意,是一个指数级的复杂度.但是测试数据比较弱,还是ac了。在网上找了找,都是brute force的解法,不知道有没有更好的解法。 解答中犯了两个错误,第一个,map> ...

programming-challenges The Tourist Guide (110903) 题解

这片文章讲的思路很清晰。当然,用bfs也是一样可以解决这个问题的。最坑的是每次过不要忘记导游自己也占了一个名额。我就是想了好久都不明白为什么示例的答案是5而不是4,把导游忘了。 http://www...

programming-challenges File Fragmentation (110306) 题解

开始一直有错误原因在于疏忽了文件片断并不对称,所以需要尝试片断1加片断2和片断2加片断1两种结果。但是我的解法不够简明,在网上看到一个好的解法,一起贴在下面: #include #include ...

programming-challenges Stack 'em Up (110205) 题解

费了很大的力气在输出格式和读取输入数据上,输出和输入真得要按照题目描述非常严格的遵守: #include #include #include #include #include #incl...

programming-challenges Ferry Loading (111106) 题解

这道题做得很郁闷,思路很好懂,可是做得时候总是出问题,到现在也不知道最开始那种写法问题在什么地方。 #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:programming-challenges Shoemaker's Problem (110405) 题解
举报原因:
原因补充:

(最多只允许输入30个字)