- 时间:2016-03-11 16:52:26 星期五
- 题目编号:POJ 1887 Testing the CATCHER
- 题目大意:一个导弹拦截系统,能拦截一切高度不比上一个导弹低的导弹(第一个导弹一定能拦截),给出一些列的导弹,问最多能拦截多少导弹
- 输入:
- 若干组数据,每组数据以-1结尾,如果一组数据以-1开头,代表输入结束
- 输出:
- 最大拦截的导弹数目,每组数据后面至少1行空行
- 分析:
- 给定一个序列,每次能拦截的导弹小于或等于上一个导弹,
- 题目转化为,给定一列数,求最大非上升序列
- 蒙了,导弹的数目没有设置上限,但是弄了个1W最大,水过了....
- 每组数据之间有一个空行!!!
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; typedef long long LL; #define CLR(x,y) memset((x),(y),sizeof((x))) #define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x)) #define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x)) #define FOR2(x,y,z) int (x);for((x)=(y);(x)<(z);++(x)) #define FORD2(x,y,z) int (x);for((x)=(y);(x)>=(z);--(x)) const int maxn = 10000; int dp[maxn],a[maxn]; int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int cntcase = 0; while(~scanf("%d",a) && ~a[0]){ int n = 1; CLR(dp,0); while(~scanf("%d",a + n) && ~a[n]) ++n; CLR(dp,0); FOR(i,0,n){ dp[i] = 1; FOR(j,0,i){ if(a[i] <= a[j]){ dp[i] = max(dp[i],dp[j] + 1); } } } int ans = 0; FOR(i,0,n){ ans = max(dp[i] , ans); } printf("Test #%d:\n maximum possible interceptions: %d\n\n",++cntcase,ans); } return 0; } |