Gym

来源:互联网 发布:cnmd是什么意思网络 编辑:程序博客网 时间:2024/06/04 19:58

算是贪心算法吧

首先预处理,存在 ** 的点赋值为 1,其他的为 0 

然后用一个 “滑动窗口” 记录左右边界 以及内部的 sum 也就是 **个数


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>#include <set>#include <map>#include <stack>#include <queue>#include <ctype.h>#include <vector>#include <algorithm>#include <sstream>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;const int maxn = 100 + 7, INF = 0x3f3f3f3f;int ac[maxn];int main() {    ios::sync_with_stdio(0);    int n,k,r, x;    cin>>n>>k>>r;    memset(ac, 0, sizeof ac);    for (int i=0; i<k; i++) {        cin>>x;        ac[x] = 1;    }    int sum = 0, L = 1, R = r;    for(int i = 1; i <= r; ++i)        sum += ac[i];    int ans = 0;    for( ; R <= n; ++R, ++L) {        if(L != 1 && ac[L-1] == 1) sum--;        if(R != r && ac[R] == 1) sum ++;        if(sum == 1) {            sum ++;            if(ac[R] == 0) ac[R] = 1;            else {                ac[R-1] = 1;            }            ans ++;        } else if(sum == 0) {            ac[R] = 1;            ac[R-1] = 1;            ans += 2;            sum += 2;        }    }    cout << ans << endl;    return 0;}