A
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
int num[qq];
int main(){
int n; scanf("%d", &n);
int ans = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", num + i);
}
for(int i = 2; i < n; ++i) {
if(num[i] > num[i - 1] && num[i] > num[i + 1]) ans++;
else if(num[i] < num[i - 1] && num[i] < num[i + 1]) ans++;
}
printf("%d\n", ans);
return 0;
}
B
很明显要求L和R数目相同并且最多,U和D也是一样,所以统计一下数目然后求最大值即可
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
int num[4];
char st[105];
int main(){
int n; scanf("%d", &n);
scanf("%s", st);
int len = strlen(st);
for(int i = 0; i < len; ++i) {
if(st[i] == 'L') num[0]++;
else if(st[i] == 'R') num[1]++;
else if(st[i] == 'U') num[2]++;
else num[3]++;
}
printf("%d\n", min(num[0], num[1]) * 2 + min(num[2], num[3]) * 2);
return 0;
}
C
二分答案判断可行性
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
char st[qq];
int len;
bool Check(int x) {
bool vis[26];
int num[26];
mst(vis, true), mst(num, 0);
for(int i = 0; i < x - 1; ++i) {
num[st[i] - 'a']++;
}
for(int i = x - 1; i < len; ++i) {
num[st[i] - 'a']++;
for(int j = 0; j < 26; ++j) {
if(num[j] == 0) vis[j] = false;
}
num[st[i - x + 1] - 'a']--;
}
for(int i = 0; i < 26; ++i) {
if(vis[i]) return true;
}
return false;
}
int main(){
scanf("%s", st);
len = strlen(st);
int l = 1, r = len;
int ans;
while(l <= r) {
int mid = (l + r) >> 1;
if(Check(mid)) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
printf("%d\n", ans);
return 0;
}
D
k很小可以组合 + 错排
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
int main(){
LL n, k; scanf("%lld%lld", &n, &k);
if(k == 1) {
puts("1");
} else if(k == 2) {
printf("%lld\n", n * (n - 1) / 2 + 1);
} else if(k == 3) {
LL a = n * (n - 1) / 2, b = n * (n - 1) * (n - 2) / 6LL * 2LL;
printf("%lld\n", a + b + 1);
} else if(k == 4) {
LL a = n * (n - 1) / 2, b = n * (n - 1) * (n - 2) / 6LL * 2LL, c = n * (n - 1) * (n - 2) * (n - 3) / 24LL * 9LL;
printf("%lld\n", a + b + c + 1);
}
return 0;
}
E
n很小,我们可以考虑分半枚举求出两部分所有选择的结果,然后枚举其中一部分的结果二分找一下另外一部分的最优解
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
LL n, m;
LL a[105], b[105];
vector<int> x, y;
void Solve(int l, int r) {
for(int i = 0; i < (1 << l); ++i) {
LL sum = 0;
for(int j = 0; j < l; ++j) {
if(i & (1 << j)) sum += a[j];
}
x.pb(sum % m);
}
for(int i = 0; i < (1 << r); ++i) {
LL sum = 0;
for(int j = 0; j < r; ++j) {
if(i & (1 << j)) sum += b[j];
}
y.pb(sum % m);
}
sort(y.begin(), y.end());
LL maxn = 0;
for(int i = 0; i < x.size(); ++i) {
int k = lower_bound(y.begin(), y.end(), m - 1 - x[i]) - y.begin();
if(k > 0 && y[k] > (m - 1 - x[i])) k--;
maxn = max(maxn, max((x[i] + y[k]) % m, (x[i] + y[y.size() - 1]) % m));
}
printf("%lld\n", maxn);
}
int main(){
scanf("%lld%lld", &n, &m);
if(n == 1) {
scanf("%lld", &a[0]);
printf("%lld\n", a[0] % m);
} else {
int l = n / 2, r = n - l;
for(int i = 0; i < l; ++i) {
scanf("%lld", a + i);
}
for(int i = 0; i < r; ++i) {
scanf("%lld", b + i);
}
Solve(l, r);
}
return 0;
}