怎么说呢,这一题应该算是百分之九十以上都是自己写的吧(因为完全看不懂解析上面的代码啊啊啊啊啊啊啊T_T),首先,分析题目,要使得尽早完成任务,必须给执行任务时间最长的那个家伙最先分派任务,因为一次只能交代一个任务,令交代第i个家伙的任务所花的时间为Bi,完成所以任务所花时间Bcost至少为B0+B1+……+B(n-1)+J(n-1),因为B0+B1+……+B(n-1)始终是不变的,所以要使总时间最小,就要让J(n-1)最小,毫无疑问,直接排序,把Ji最小的那个人放在最后指派任务23333333
废话少说,先放代码:
#include <iostream> #include <stdio.h> using namespace std; struct comd { int b, j; }; void sort(struct comd*begin, struct comd*end); int main() { int n, ph = 0; struct comd comd[1000]; //这一段开始的时候没有设定大小导致直接爆掉,太伤感了T_T while(scanf("%d", &n) == 1 && n) { for(int i = 0; i < n; i++) scanf("%d%d", &comd[i].b, &comd[i].j); sort(comd, comd+n); int B = 0, p = 0, Bcost = 0; //注意变量的定义,就是因为定义到循环外面去了导致结果一直出错T_T for(int i = 0; i < n; i++) B += comd[i].b; for(int i = 0; i < n-1; i++) { B -= comd[i].b; if(comd[i].j < B+comd[n-1].j) p++; else {p = i; break;} } for(int i = 0; i <= p; i++) Bcost += comd[i].b; Bcost += comd[p].j; ph++; printf("case %d : %d ", ph, Bcost); } return 0; } void sort(struct comd*begin, struct comd*end) //冒泡排序还不是很熟啊,看来还是要多加练习!!!! { struct comd temp; int n = end - begin, i, k; for(i = 0; i < n; i++) { for(k = 0; k < n-i; k++) { if((begin+k+1)->j > (begin+k)->j) { temp = *(begin+k); *(begin+k) = *(begin+k+1); *(begin+k+1) = temp; } } } return; };
感觉自己的方法好笨拙……但是实在是不理解那些库函数 = =