Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
类似背包问题,数据很弱,剪纸就过(附代妈)//============================================================================ // Name : main1040.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> using namespace std; int maxi = 0; int cur = 0; int state[10] = {0}; int n; void clear(){ maxi = 0; cur = 0; for(int i = 0; i < 10; i++) state[i] = 0; } int Max(int a, int b){ if(a < b) return b; return a; } class order{ public: int start; int end; int num; int price; order(int s, int e, int n): start(s), end(e), num(n), price(0){} order():start(0), end(0), num(0), price(0){} }; int partion(order *array, int p, int r) { order x = array[r]; int i = p - 1;//注意这点,把i设成负值,然后作为移动的标志 int j; for (j = p; j < r; j++) { if (array[j].price > x.price) { i++; order temp = array[j]; array[j] = array[i]; array[i] = temp; } } order temp = array[j]; array[j] = array[i + 1]; array[i + 1] = temp; return i+1;//返回的应该是交换后的哨兵的位置 } //递归解决每个划分后的小 void quickSort(order* array, int p, int r) { if (p < r) { int q = partion(array, p, r); quickSort(array, p, q - 1); quickSort(array, q + 1, r); } } void findMax(order* orders, int *psum, int ord, int plc){ //最初plc为orders的长度 if(plc == 0) return; //首先判断当前的order是否可以被接受 int idx = ord - plc; order temp = orders[idx]; bool can = true; for(int i = temp.start; i < temp.end; i++){ if(state[i] + temp.num > n){ can = false; break; } } if(can){ cur += temp.price; for(int i = temp.start; i < temp.end; i++) state[i] += temp.num; maxi = Max(maxi, cur); findMax(orders, psum, ord, plc-1); cur -= temp.price; for(int i = temp.start; i < temp.end; i++) state[i] -= temp.num; } //如果不选这个,看看剩下的是否能达到max,不能达到就不理 if(cur + psum[idx+1] <= maxi) return; findMax(orders, psum, ord, plc-1); } int main() { while(1){ int m, ord; cin >> n >> m >> ord; if(n == 0 && m == 0 && ord == 0) return 0; order *orders = new order[ord]; for(int i = 0; i < ord; i++){ int s, e, N; cin >> s >> e >> N; orders[i].start = s; orders[i].end = e; orders[i].num = N; orders[i].price = (e-s)*N; } quickSort(orders, 0, ord-1); clear(); int psum[30] = {0}; for(int i = ord-1; i >= 0; i--) psum[i] = psum[i+1] + orders[i].price; findMax(orders, psum, ord, ord); cout << maxi << endl; } //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator