码迷,mamicode.com
首页 > 其他好文 > 详细

CF1169(div2)题解报告

时间:2019-08-23 00:24:06      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:stream   贪心   ios   algo   mat   getc   二分   存在   scan   

CF1169(div2)题解报告

A

不管

B

首先可以证明,如果存在解

其中必定有一个数的出现次数大于等于\(\frac{m}{2}\)

暴力枚举所有出现次数大于等于$\frac{m}{2} $的数

剩下的数看看有没有一个公共数即可

由于出现次数大于等于$\frac{m}{2} $的数不会太多

所以时间复杂度应该是\(O(n)\)

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
inline int read(){
    int v = 0,c = 1;char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') c = -1;
        ch = getchar();
    }
    while(isdigit(ch)){
        v = v * 10 + ch - 48;
        ch = getchar();
    }
    return v * c;
}
const int N = 3e5 + 3;
int n,r;LL ans;
char s[N];
int main(){
    scanf("%s",s + 1);
    n = strlen(s + 1);
    r = n + 1;
    for(int i = n - 1;i >= 1;--i){
        r = min(r,i + 9);
        for(int k = 1;i + 2 * k <= r;++k){
            if(s[i] == s[i + k] && s[i] == s[i + k + k]){
                r = min(r,i + k + k);
                break;  
            }
        }
        ans += n - r + 1;
    }
    cout << ans;
    return 0;
}

C

所有题目先考虑答案是否就有单调性

这种最优解问题且答案具有单调性的题目先考虑二分答案

然后看卡能否贪心判断可行性

这道题我们二分枚举答案之后

我们肯定是贪心的让每个数都尽量小

对于一个数

如果他能在二分的答案的步数之内达到最小值就去

如果不行看看是否合法,判断一下是否无解

因为我们肯定不会让一个满足条件数再变大,那样只会不优

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 3e5 + 3;
int a[N];
int f[N];
int pre[N];
int n,m;
inline int read(){
    int v = 0,c = 1;char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') c = -1;
        ch = getchar();
    }
    while(isdigit(ch)){
        v = v * 10 + ch - 48;
        ch = getchar();
    }
    return v * c;
}
int ans = 0x3f3f3f3f;
inline bool check(int mid){
    for(int i = 1;i <= n;++i) pre[i] = a[i];
    pre[1] = m - a[1] > mid ? a[1] : 0;
    for(int i = 2;i <= n;++i){
        if(a[i] < pre[i - 1]){
            if(pre[i - 1] > a[i] + mid) return 0;
            pre[i] = pre[i - 1];    
        }
        else{
            if(a[i] == pre[i - 1]) pre[i] = a[i];
            if(a[i] > pre[i - 1]) pre[i] = m - a[i] + pre[i - 1] > mid ? a[i] : pre[i - 1];
        }
    }
    return 1;
}
int main(){
    n = read(),m = read();
    for(int i = 1;i <= n;++i) a[i] = read();
    int l = 0,r = 10000000,ans;
    while(l <= r){
        int mid = (l + r) >> 1;
        if(check(mid)) r = mid - 1,ans = mid;
        else l = mid + 1;
    }
    cout << ans;
    return 0;
}

D

神仙暴力题Orz

CF1169(div2)题解报告

标签:stream   贪心   ios   algo   mat   getc   二分   存在   scan   

原文地址:https://www.cnblogs.com/wyxdrqc/p/11397266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!