4 条题解
-
18
话不多说,直接上代码:
#include <bits/stdc++.h> using namespace std; int k[1000010],dp[100010]; int n,ans,a,b; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a>>b; k[a]=b; } for(int i=0;i<=1000000;i++) { if(k[i]){ int j=i-k[i]-1; if(j>=0){ dp[i]=dp[j]+1; } else { dp[i]=1; } } else{ dp[i]=dp[i-1]; } ans=max(ans,dp[i]); } cout<<n-ans; return 0; }
打码不易,点个赞吧!
100 Accepted
# 状态分数 耗时 内存占用 -------------------------------------- #1 Accepted10 36ms 7.4 MiB - #2 Accepted10 31ms 7.6 MiB #3 33ms 6.9 MiB #4 28ms #5 25ms #6 17ms 7.6 MiB #7 15ms 7 MiB #8 10ms 7.8 MiB #9 5ms 7.5 MiB #10 2ms -
3
f[i]表示从i开始从右往左激活激光塔,最终摧毁的激光塔数量。初始状态f[0]=0。可以使用二分找到没有激活i之后,被摧毁的最左边的激光塔p,那么状态可以转移为f[p - 1] + i - p(其中i-p是被i摧毁的激光塔数量)。枚举添加新激光塔后,没有被摧毁的最右边的激光塔i,则被摧毁的激光塔数量为f[i] + n - i,取最小值即为答案。
核心代码
sort(t + 1, t + n + 1); for (int i = 1; i <= n; i++) { int p = lower_bound(t + 1, t + i, (T){t[i].a - t[i].b, 0}) - t; f[i] = f[p - 1] + i - p; } int ans = 1e9; for (int i = 1; i <= n; i++) ans = min(ans, f[i] + n - i); cout << ans << endl;
结构体定义
struct T { int a, b; bool operator < (const T& x) const { if (a == x.a) return b < x.b; return a < x.a; } } t[MAXN];
-
-7
😄
#include <bits/stdc++.h> using namespace std; int k[1000010], dp[1000010]; int n, a, b, ans; int main() { cin >> n; for (int i = 0; i <n ; i ++) { cin >> a >> b; k[a] = b; } for (int i = 0; i <= 1000000; i ++) { if (k[i] > 0) { int pre = i - k[i] - 1; if (pre >= 0) { dp[i] = dp[pre] + 1; } else dp[i] = 1; } else { dp[i] = dp[i - 1]; } ans = max(ans, dp[i]); } cout << n - ans; }
-
-8
#include <bits/stdc++.h> using namespace std; int k[1000010],dp[100010]; int n,ans,a,b; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a>>b; k[a]=b; } for(int i=0;i<=1000000;i++) { if(k[i]){ int j=i-k[i]-1; if(j>=0){ dp[i]=dp[j]+1; } else { dp[i]=1; } } else{ dp[i]=dp[i-1]; } ans=max(ans,dp[i]); } cout<<n-ans; return 0; }
- 1
信息
- ID
- 267
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 576
- 已通过
- 327
- 上传者