半个下午,总算A过去了
毕竟水题
好歹是自己独立思考,debug,然后2A过的
我为人人的dp算法
题意:
为了支持你的观点,你需要从给的数据中找出尽量多的数据,说明老鼠越重速度越慢这一论点
本着“指针是程序员杀手”这一原则,我果断用pre来表示这只老鼠的直接前驱的序号
代码中我是按体重从大到小排序,然后找出一条最长的体重严格递减速度严格递增的“链”(其实找到的是链尾)。
然后输出的时候从后往前输出
对结构体排序
对于样例来说,循环完以后应该是这样的:
order | 2 | 3 | 4 | 8 | 1 | 5 | 7 | 0 | 6 |
weight | 500 | 1000 | 1100 | 2000 | 6000 | 6000 | 6000 | 6008 | 8000 |
speed | 2000 | 4000 | 3000 | 1900 | 2100 | 2000 | 1200 | 1300 | 1400 |
lenth | 1 | 1 | 2 | 3 | 3 | 3 | 4 | 4 | 4 |
pre | -1 | -1 | 3 | 4 | 4 | 4 | 8 | 8 | 8 |
pre == -1代表没有前驱。
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 struct Mouse 9 { 10 int order; 11 int weight; 12 int speed; 13 int pre; 14 int lenth; 15 }mice[1010]; 16 17 int a[1010]; 18 19 bool cmp1(Mouse a, Mouse b) 20 { 21 if(a.weight != b.weight) 22 return (a.weight > b.weight); 23 return (a.speed < b.speed); 24 } 25 26 bool cmp2(Mouse a, Mouse b) 27 { 28 return (a.order < b.order); 29 } 30 31 int main(void) 32 { 33 #ifdef LOCAL 34 freopen("1160in.txt", "r", stdin); 35 #endif 36 37 int cnt = 0; 38 int w, s; 39 while(scanf("%d%d", &w, &s) == 2) 40 { 41 mice[cnt].weight = w; 42 mice[cnt].speed = s; 43 mice[cnt].order = cnt; 44 ++cnt; 45 } 46 47 sort(mice, mice+cnt, cmp1); 48 int i, j; 49 for(i = 0; i < cnt; ++i) 50 { 51 mice[i].lenth = 1; 52 mice[i].pre = -1; 53 } 54 //我为人人 55 for(i = 1; i < cnt; ++i) 56 { 57 for(j = 0; j < i; ++j) 58 { 59 if(mice[j].weight > mice[i].weight 60 && mice[j].speed < mice[i].speed 61 && mice[j].lenth+1 > mice[i].lenth) 62 { 63 mice[i].lenth = mice[j].lenth + 1; 64 mice[i].pre = mice[j].order; 65 } 66 } 67 } 68 69 sort(mice, mice+cnt, cmp2); 70 int maxlen = 0; 71 for(i = 1; i < cnt; ++i) 72 if(mice[i].lenth > mice[maxlen].lenth) 73 maxlen = i; 74 int l = mice[maxlen].lenth; 75 printf("%d\n%d\n", l, maxlen+1); 76 77 int p = maxlen; 78 for(i = 1; i < l; ++i) 79 { 80 printf("%d\n", mice[p].pre+1); 81 p = mice[p].pre; 82 } 83 return 0; 84 }
代码君
HDU 1160 FatMouse's Speed
时间: 2024-10-10 00:00:52