今天先补A~C啦,D题明天再说
模拟题,easy
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
using ll = long long;
void solve() {
int n; cin >> n;
vector<int>a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans++;
if (ans == a[i]) {
ans++;
}
}
cout << ans << '\n';
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin >> t;
while (t--)
solve();
}
B题
暴力,数字1~50,枚举,如果要让某一个数不存在S中,S中还有的不同的数的数量,代码写得比较丑
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e9 + 5;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
void solve(){
int n; cin >> n;
int s[55][55] = { };
int s2[55][55] = { };
int idx[55]={ };
bool fg[55] = { };
bool fg2[55] = { };
for (int i = 1; i <= n; i++) {
int k; cin >> k;
idx[i] = k;
for (int j = 1; j <= k; j++) {
int m; cin >> m;
s[i][m]++;
fg[m] = true;
s2[i][j] = m;
}
}
int ans = 0; int t = 0;
for (int i = 1; i <= 50; i++) {
memset(fg2, 0, sizeof fg2);
t = 0;
if (!fg[i])continue;
for (int j = 1; j <= n; j++) {
if (s[j][i]) { continue; }
for (int k = 1; k <= idx[j]; k++) {
if (!fg2[s2[j][k]]) {
t++;
fg2[s2[j][k]] = 1;
}
}
}
ans = max(ans, t);
}
cout << ans << '\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
std::cout.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
C题,没开long long, WA2了,好吧!
假设我们一定选第i个,那么第i个后面的正整数就都能取得
开个后缀和优化一下,写后缀和数组时就把负数当成0就行
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e9 + 5;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
void solve(){
int n; cin >> n;
vector<ll>a(n + 1);
vector<ll>suf(n + 2);//suffix数组
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = n; i >= 1; i--) {
suf[i] = suf[i + 1] + max(1ll*0, a[i]);
}
ll ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, (i & 1) * a[i] + suf[i + 1]);
}
cout << ans << '\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
std::cout.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}