CodeForces杂题/1月训练

1.#490 div3

A. Mishka and Contest

 

解题思路:

水题,从左到右扫,再从右到左扫,无需在此特判,只需要在最后特判即可。

#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
using namespace std;
deque<int> q;
bool f;
int n;
int k;
const int maxn = 105;
int a[maxn];
int main() {
    cin >> n >> k;
    int ans = 0;
    int i = 0;
    for(i = 0; i < n ; i++) {
        cin >> a[i];
    }
    i = 0;
    while(i < n && a[i]<= k) {
        ans++;
        i++;
    }
    int j = n - 1;
    while(j >= 0 && a[j] <= k) {
        ans++;
        j--;
    }
    ans > n ? printf("%d\n",ans/2):printf("%d\n",ans);
}

 

B. Reversing Encryption

 

题意:翻转字符串中的字母。

解题思路:如果单纯模拟的话还挺费时费力的。需要用到一个函数:

reverse
#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
#include <vector>
using namespace std;
int n;
const int maxn = 105;
char s[maxn];
int main() {
    cin >> n;
    cin >> s;
    for(int i = 1; i <= n;i++) {
        if(n%i == 0){
            reverse(s,s+i);
        }
    }
    cout << s << endl;
}

 

C. Alphabetic Removals

 

 

题意:根据字典序按要求去除字符。

解题思路:模拟

#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
#include <vector>
using namespace std;
int n, k;
const int maxn = 4e5+5;
char s1;
struct edge{
    char s;
    int pos;
    int f;
}point1[maxn],point2[maxn];
bool cmp(edge a,edge b) {
    if(a.s==b.s) return a.pos < b.pos;
    return a.s<=b.s;
}
int main() {
    cin >> n >> k;
    if(k>=n) cout <<endl;
    else {
        for (int i = 0; i < n; i++) {
            cin >> s1;
            point1[i].s = s1;
            point1[i].pos = i;
            point1[i].f = 1;
            point2[i] = point1[i];
        }
        sort(point2, point2 + n,cmp);
        for (int i = 0; i < k; i++) {
            int cnt = point2[i].pos;
            point1[cnt].f = 0;
        }
        for(int i = 0; i < n; i++) {
            if(point1[i].f)
                cout <<point1[i].s;
        }
        cout << endl;
    }
}

 

CodeForces 1234 div3

C. Pipes

 

好题目!

解题思路:DP判断,其实只有两种管道,1和2,且由于只有两行,因此只需要考虑1和2直接的衔接即可。

#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
#include <vector>
using namespace std;
int T;
const int maxn = 2e5 + 5;
char pipes[2][maxn];
int main() {
    cin >> T;
    while(T--) {
        int n;
        cin >> n;
        for(int i = 0; i < 2;i++) {
            for(int j = 0; j < n; j++){
                cin >> pipes[i][j];
            }
        }
        int now = 0;
        int j;
        for(j = 0; j < n; j++) {
            if(now == 0 && pipes[now][j] > '2') {
                if(pipes[1][j] <= '2') break;
                else now = 1;
            } else if(now == 1 && pipes[now][j] > '2') {
                if(pipes[0][j] <= '2') break;
                else now = 0;
            }
        }
        if(now == 1 && j == n) cout << "YES" << endl;
        else cout << "NO" << endl;

    }
    return 0;
}

 

D. Distinct Characters Queries

树状数组。

 

#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
#include <vector>
using namespace std;
int T;
int len;
const int maxn = 1e5+5;
int c[27][maxn];
char s[maxn];
int lowbit(int x) {
    return x&(-x);
}
void update(int i,int j, int k) {
    while(j <= len) {
        c[i][j] += k;
        j+=lowbit(j);
    }
}
int queryy(int i,int j) {
    int ans = 0;
    while(j) {
        ans += c[i][j];
        j-=lowbit(j);
    }
    return ans;
}
int main() {
    cin >> (s+1);
    len = strlen(s+1);
    scanf("%d",&T);
    int q;
    int x,z;
    char y;
    for(int i = 1; i <= len; i++) update(s[i]-'a',i,1);
    for(int i = 1; i <= T; i++) {
        scanf("%d",&q);
        if(q == 1) {
            scanf("%d %c",&x,&y);
            update(s[x] - 'a', x, -1);
            update(y-'a',x,1);
            s[x] = y;
        }
        else {
            cin >> x >> z;
            int sum = 0;
            for(int j = 0; j < 26; j++) {
                if(queryy(j,z) - queryy(j,x-1)>=1) sum++;
            }
            cout << sum << endl;
        }
    }

    return 0;
}

 

Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division

 

#include <iostream>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <stack>
using namespace std;
deque<int> q;
bool f;
int n;
char s;
int main() {
    cin >> n;
    int a[]= {4,7,44,47,74,77,444,447,474,477,744,747,774,777};
    //int cnt = sizeof(a);
    //cout << cnt<<endl;
    for(int i = 0; i < 14; i++) {
        if(n % a[i] == 0) {f = 1;
            break;}

    }
    if(f) cout <<"YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值