这是一道Special Judge的题目,查了一下
定义:一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被Special Judge.
Special Judge程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回.
题目刚开始觉得挺简单的,后来做着做着就有可多问题,还是做题少啊。。。
思路比较简单,按重量W排序,之后去求速度V的下降子序列
自己写的比较有条理、看代码注释吧
1 #include<stdio.h>
2 #include<string.h>
3 typedef struct {
4 int w,s,old; //old存储排序前的序号,输出的时候用
5 }mice;
6 mice m[1001];
7 int flag[1001];
8 int pre[1001];
9
10 int main()
11 {
12 int n,i=1,j,k,max;
13 mice temp;
14 while(scanf("%d%d",&m[i].w,&m[i].s)==2)
15 {
16 m[i].old = i;
17 i++;
18 }
19 n = i-1;
20 for(i=1;i<=n-1;i++)
21 {
22 k = i;
23 for(j=i+1;j<=n;j++)
24 if(m[k].w>m[j].w) k = j;
25 if(k!=i)
26 {
27 temp = m[k];
28 m[k] = m[i];
29 m[i] = temp;
30 }
31 }
32 for(i=1;i<=n;i++)
33 flag[i] = 1;
34 memset(pre,0,sizeof(pre));
35 for(i=n-1;i>=1;i--)
36 for(j=i+1;j>=1;j--)
37 if(m[i].w>m[j].w&&m[i].s<m[j].s) //不下降子序列核心
38 {
39 if(flag[j]<flag[i]+1)
40 {
41 flag[j] = flag[i]+1;
42 pre[j] = i;
43 }
44 }
45 max = 0;
46 k = 0;
47 for(i=1;i<=n;i++)
48 {
49 if(max<flag[i])
50 {
51 max = flag[i];
52 k = i;
53 }
54 }
55 printf("%d\n",max);
56 while(k)
57 {
58 printf("%d\n",m[k].old); //输出原序号
59 k = pre[k];
60 }
61
62 return 0;
63 }