题意:给定一个只包含 1,2,3,4 的长度为 n 的数组 a 和整数 k, 求包含 1,2,3,4 且有 k 个 4 的最短连续区间长度。
解:双指针。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint N = 2e5 + 10; int a[N], p[5]; intmain(){ int n, k, num = 0; cin >> n >> k; for(int i = 1; i <= n; ++ i) cin >> a[i]; int ans = n; for(int l = 1, r = 1; r <= n; ++ r){ p[a[r]] ++; while(p[1] >= 1 && p[2] >= 1 && p[3] >= 1 && p[4] >= k && l <= r){ ans = min(ans, r - l + 1); p[a[l]] --; l ++; } } cout << ans; }
#include<bits/stdc++.h> usingnamespace std; int d[3010]; intmain(){ ios::sync_with_stdio(0); cin.tie(0); int n, x = 0, y = 0; cin >> n; for(int i = 1; i <= n; ++ i){ for(int j = 1; j <= n; ++ j){ int x; cin >> x; if(x) d[i] ++; } } sort(d + 1, d + 1 + n); for(int i = 1, j = 0, s = 0; i <= n; ++ i){ s += d[i]; if(s == i * (i - 1) / 2){ if(i - j <= 2){cout << n - 1; return0;} j = i; } } cout << n; }
题H
题意:由 n 个奶酪,体积分别为 ai,价值为 bi,只能按从前往后的顺序拿,当且仅当第 i 个奶酪被损坏或者拿走才能对第 i+1 奶酪操作。一共由 m 个背包,每个背包体积为 wi,每次拿一个背包从第一个奶酪出发,问最多拿走多少价值的奶酪(1<=n<=200,1<=m<=1e5,1<=ai<=200,1<=bi<=1e5,1<=wi<=200)。