做的时候觉得这么做会超时,而且放在DP专题里,应该用非常明显的DP来做,结果卡了两个小时还是没想出来,才发觉原来的想法是对的,0ms就过了。
每增加一套系统就把这套系统的使用后的高度存下来,以后每遇到一枚导弹就在系统里面找高度大于这枚导弹但是又最接近它的那套系统,因为这样浪费的高度最小,然后把这套系统的高度修改成这枚导弹的高度就行,如果所有系统都无法击落它,那就新增一套系统,高度还是这枚导弹的高度。
1 #include2 #include 3 #include 4 #define MAX 100005 5 6 int main(void) 7 { 8 int n; 9 int min,count,flag,box;10 int dp[MAX];11 12 while(scanf("%d",&n) != EOF)13 {14 count = 0;15 for(int i = 0;i < n;i ++)16 {17 scanf("%d",&box);18 19 flag = 0;20 for(int j = 0;j < count;j ++)21 if(dp[j] > box)22 {23 if(!flag)24 min = j;25 flag = 1;26 if(dp[min] > dp[j])27 min = j;28 }29 if(!flag)30 dp[count ++] = box;31 else32 dp[min] = box;33 }34 printf("%d\n",count);35 }36 37 return 0;38 }