[1535A ]. Fair Playoff
-
思路:实力最强(数值最大)的两个人需要分别在前俩和后俩中
#include<bits/stdc++.h> #define fora(i, a, b) for(int i = a; i <= b; i++) #define fors(i, a, b) for(int i = a; i >= b; i--) #define ll long long using namespace std; int t, s1, s2, s3, s4; int main(){ cin >> t; while(t--){ int x, y, p, q; cin >> x >> y >> p >> q; s1 = max(x, y), s2 = min(x, y); s3 = max(p, q), s4 = min(p, q); cout << ((s1 < s4 || s3 < s2) ? "NO" : "YES") << endl; } }
[1535B]. Array Reodering
-
思路:将所有的偶数都放到前面,奇数放后面,每个偶数 a [ i ] a[i] a[i]和后面的 2 a [ j ] 2a[j] 2a[j]一定都不互质,轮到奇数再求 g c d gcd gcd判断
#include<bits/stdc++.h> #define fora(i, a, b) for(int i = a; i <= b; i++) #define fors(i, a, b) for(int i = a; i >= b; i--) #define ll long long using namespace std; int t, n; vector <int> a, b; int gcd(int a, int b){ if(b == 0) return a; return gcd(b, a % b); } int main(){ cin >> t; while(t--){ cin >> n; int odd = 0, ans = 0; a.clear(), b.clear(); fora(i, 1, n){ int tmp; cin >> tmp; if(tmp % 2 == 0) a.push_back(tmp); else{ b.push_back(tmp); odd++; } } fora(i, 0, odd - 1) a.push_back(b[i]); fora(i, 0, n - 1){ if(i <= n - odd - 1){ ans += n - 1 - i; continue; } fora(j, i + 1, n - 1) if(gcd(a[i], a[j]) > 1) ans++; } cout << ans << endl; } }
[1535C]. Unstable String
-
思路:遇到序列一定要想动态规划,针对每一位为 0 0 0或 1 1 1的情况讨论,在 d p [ i ] [ 0 ] , d p [ i ] [ 1 ] dp[i][0], dp[i][1] dp[i][0],dp[i][1]中哪个大就代表 “ ? ” “?” “?”充当哪一个合适
#include<bits/stdc++.h> #define fora(i, a, b) for(int i = a; i <= b; i++) #define fors(i, a, b) for(int i = a; i >= b; i--) #define ll long long using namespace std; int t, ls; ll ans, dp[200005][2]; string s; int main(){ cin >> t; while(t--){ cin >> s; ans = 0; memset(dp, 0, sizeof(dp)); ls = s.length(); fora(i, 1, ls){ char now = s[i - 1]; //为了不出现dp[-1][k]的情况,整体i表示i - 1 if(now == '?'){ dp[i][0] = dp[i - 1][1] + 1; dp[i][1] = dp[i - 1][0] + 1; } else if(now == '0') dp[i][0] = dp[i - 1][1] + 1; else if(now == '1') dp[i][1] = dp[i - 1][0] + 1; ans += max(dp[i][0], dp[i][1]); } printf("%lld\n", ans); } }
一开始想的 O ( n 3 ) O(n^3) O(n3)的 b r u t e f o r c e brute force bruteforce作法,但是在第 4 4 4个点 T L E TLE TLE了
#include<bits/stdc++.h> #define fora(i, a, b) for(int i = a; i <= b; i++) #define fors(i, a, b) for(int i = a; i >= b; i--) #define ll long long using namespace std; int t, ls, ans; string s; bool check(string a){ int l = a.length(); fora(i, 0, l - 2) if(a[i] >= '0'){ int gap = 0; while(a[i + gap + 1] < '0'){ gap++; if(i + gap + 1 >= l) return 1; } if(gap % 2 == 1 && a[i] != a[i + gap + 1]) return 0; if(gap % 2 == 0 && a[i] == a[i + gap + 1]) return 0; } return 1; } int main(){ cin >> t; while(t--){ cin >> s; ans = 0; ls = s.length(); fora(i, 0, ls - 1) if(s[i] == '?') s[i] = '-'; ans += ls; fora(cnt, 2, ls) fora(i, 0, ls - cnt){ string tmp = s.substr(i, cnt); //截取函数 if(check(tmp)) ans++; } cout << ans << endl; } }
[1535D]. Playoff Tournament
变强了再做。。。
[1535E]. Gold Transfer
变强了再做。。。
[1535F]. String Distance
变强了再做。。。