刷题之Educational Codeforces Round 110 (Rated for Div. 2)

[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

变强了再做。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值