C3-炮弹杀伤力
题面
世界需要和平,人民向往和平。
但是,历史上,很多和平都是靠战争换来的。
Z国和Y国开战了,Z国已经向Y国摆好了n门炮弹,记为
你是该场战争的指挥官,如何安排炮弹的发射顺序,使得杀伤力最大。
输入
第一个数为炮弹门数n(
接下来1行,包括n个正整数,第i个数表示摆放的第i门炮弹的发射射程k(
输出
输出一行,是一个整数,表示该场战争发射炮弹形成的杀伤力。
输入样例
3 16 10 15
输出样例
2
样例解释
发射第2门(射程为10)和第3门(射程为15)炮弹。
代码(n^2解法 最长上升子序列)
#includeusing namespace std; unsigned int dp[500005],a[500005],ans; int main() { int n; cin >> n; a[0] = 0x3f3f3f3f; ans = 0; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = 1; i <= n; i++) { dp[i] = 1; for(int j = 0; j < i ; j++) if(a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1); ans = max(ans,dp[i]); } cout< endl; return 0; }
代码 nlogn解法
#includeusing namespace std; unsigned int f[500005],a[500005]; int main() { int n,ans = 0; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; for(int i = 0; i < n; i++) { if(a[i] > f[ans]){ f[++ans] = a[i]; } else { int l = 0, r = ans; while(l < r) { int mid = (l + r )>> 1; if(f[mid] >= a[i]) r = mid; else l = mid +1; } f[l] = a[i]; } } cout< endl; return 0; }