交A题结果交到了B题上了 WA了我一发 TMD
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
void solve() {
int a, b, c, x, y;
cin >> a >> b >> c >> x >> y;
if(x < a) x = 0;
else x -= a;
if(y < b) y = 0;
else y -= b;
if(c >= x + y) cout << "YES" << endl;
else cout << "NO" << endl;
}
signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
void solve() {
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> w[i];
int ans = 0;
for(int i = n - 2; i >= 0; i--) {
while(w[i] >= w[i+1]) {
w[i]/=2;
ans++;
if(w[i] == 0 && w[i+1] == 0) {
cout << -1 << endl;
return;
}
}
}
bool flag = true;
for(int i = 0; i < n - 1; i++) {
if(w[i] > w[i+1]) {
flag = false;
break;
}
}
if(flag) cout << ans << endl;
else cout << -1 << endl;
}
signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
这题,卡了我许久,其实一开始思路是对的,但是代码有逻辑问题,调试了好久,也怪我能力不行,才导致后面的题目全崩了。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
void solve() {
string s;
cin >> s;
int i = 0, j = s.size() - 1;
for(i = 0; i < s.size(); i++) {
if(s[i] == '0') break;
}
for(j = s.size() - 1; j >= 0; j--) {
if(s[j] == '1') break;
}
int len = s.size();
i = min(i, len - 1);
j = max(j, 0ll);
cout << i - j + 1 << endl;
}
signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
dfs就行了, 其实可以发现不管怎么往下找, 都是最优解。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int h[N], e[N], ne[N], idx;
int cnt = 0;
vector<int>w[N];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, int flag) {
if(flag) w[++cnt].push_back(u);
else w[cnt].push_back(u);
int t = 0;
for(int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
dfs(j, t);
t = 1;
}
}
void solve() {
int n;
cin >> n;
memset(h, -1, sizeof h);
idx = cnt = 0;
int root;
int x;
for(int i = 1; i <= n; i++) {
cin >> x;
if(x != i) {
add(x, i);
} else root = i;
}
dfs(root, 0);
cout << cnt + 1 << endl;
for(int i = 0; i <= cnt; i++) {
cout << w[i].size() << endl;
for(auto u : w[i]) cout << u << ' ';
cout << endl;
w[i].clear();
}
cout << endl;
}
signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
看的大佬的代码 才知道怎么实现的。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
vector<int>pos[N];
char s[N];
void solve() {
int n, k;
cin >> n >> k;
scanf("%s", s);
for(int i = 0; i < 26; i++) pos[i].clear();
for(int i = 0; i < n; i++) {
pos[s[i] - 'a'].push_back(i);
}
int maxc = 0;
for(int i = 0; i < n; i++) {
if(s[i] == 'a') continue;
int t = min(k, max(s[i] - 'a' - maxc, 0ll));
if(!t) continue;
k -= t;
int t1 = s[i] - 'a', t2 = s[i] - 'a' - t;
char res = t2 <= maxc ? 'a' : t2 + 'a';
for(int j = t1; j >=t2; j--) {
for(auto u : pos[j]) {
s[u] = res;
}
}
if(!k) break;
maxc = max(maxc, t1);
}
cout << s << endl;
}
signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}