3 条题解
-
4
#include <bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 200005 int cmp(int x, int y) { return x > y; } int a[maxn], b[maxn]; int main() { int n, j = 1; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; b[i] = 0; } sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; i++) { while (a[i] - a[j] <= 5 && j <= n) { j++; } b[i] += (j - i); if (b[i] >= (n - i + 1)) break; } int max1 = b[1]; for (int i = 1; i <= n; i++) if (b[i] > max1) max1 = b[i]; cout << max1; return 0; }//已AC
-
2
这道题可以用滑动窗口来做。 设左端为i, 右端为j, 因为a数组已经排好了,最大数减最小数即为a[j] - a[i],长度为j - i + 1, 差大了就缩小窗口(i++),差大了就扩大窗口(j++), 答案就是所有长度里最大的一个。
int n, a[200005], ans; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; sort(a+1, a+n+1); int i = 1, j = 1; while (j <= n) { if (a[j] - a[i] <= 5) { ans = max(ans, j - i + 1); j++; } else i++; } cout << ans; return 0; }
-
1
bool check(int x){//check函数(难点1) int maxx=0,minn=123121213; for(int i=1;i<=n-x+1;i++){ maxx=max(maxx,a[i]),minn=min(minn,a[i]); }return maxx-minn<=5; }
二分竟然可以(一开始我是试试看)
sort(a+1,a+n+1);//sort不能少(难点2)
while(l<=r){ mid=(l+r)/2; if(check(mid){ ans=mid;l=mid+1;} { else r=mid-1;//二分答案 } cout<<ans;//已AC,请放心食用 return 0; }
- 1
信息
- ID
- 1917
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 268
- 已通过
- 112
- 上传者