这题和hdu 1160一样。因为刚学了nlogn,所以这题也想用它,结果杯具了。因为我总是想不出weight相同时该怎么处理,以及怎么输出。在nlogn的框架下我想了N小时,最后决定换思路。后来用的是用数组记录长度与距离,结果又因为一个很小的细节又搞了一个多小时,简直就是“餐具”啊!
这个细节是 if(** > **) f[i] = f[j] + 1; 少了一个 && ……
1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 using namespace std;
5 typedef struct
6 {
7 int num,wt,iq;
8 }Ele;
9 Ele ele[1005];
10 int p[1005],f[1005],len;
11 bool cmp(Ele a,Ele b)
12 {
13 if(a.wt == b.wt) return a.iq < b.iq;
14 else return a.wt > b.wt;
15 }
16 void prians(int a)
17 {
18 printf("%d\n",ele[a].num);
19 if(p[a] != -1)
20 prians(p[a]);
21 }
22 int main()
23 {
24 int a,b,i,j,t,start,cnt=0;
25 while(scanf("%d %d",&a,&b) != EOF)
26 {
27 ele[cnt].wt = a;
28 ele[cnt].iq = b;
29 ele[cnt].num = cnt+1;
30 cnt++;
31 }
32 sort(ele,ele+cnt,cmp);
33 for(i = 1; i < cnt; i++)
34 f[i] = 1;
35 memset(p,-1,sizeof(p));
36 len = 1;
37 start = 0;
38 for(i = 1; i < cnt; i++)
39 for(j = 0; j < i; j++)
40 if(ele[j].wt != ele[i].wt && ele[i].iq > ele[j].iq && f[j]+1 > f[i])
41 {
42 f[i] = f[j]+1;
43 p[i] = j;
44 if(f[i] > len)
45 len = f[i],start = i;
46 }
47 printf("%d\n",len);
48 prians(start);
49 return 0;
50 }