Codeforces Round 350 div2 670ABCDEF

来源:互联网 发布:珠海广电网络 编辑:程序博客网 时间:2024/05/29 21:32

Codeforces Round 350 div2
通过数:5
都是简单题,最后一题由于中间有点事空了一段时间,赛后没看题解只看数据过了。
A:
简单题。刚开始想用暴力写的,尽量避免分类讨论。
然后发现暴力还不如分类讨论

#include <bits/stdc++.h>using namespace std;int main(){    int n;    while(scanf("%d", &n) != EOF) {        int s1, s2;        int ans1, ans2;        ans1 = n / 7 * 2;        ans2 = n / 7 * 2;        if(n % 7 >= 6) ans1++;        if(n % 7 != 0) ans2 += min(2, n % 7);        printf("%d %d\n", ans1, ans2);    }    return 0;}

B:
简单题。回忆一下等差数列,虽然和这题没有什么关系。枚举一下目前到哪个人就好啊。

#include <bits/stdc++.h>using namespace std;const int MAXN = 100000 + 5;int id[MAXN], n;int main(){    int k;    while(scanf("%d%d", &n, &k) != EOF) {        for(int i = 1 ; i <= n ; i++)            scanf("%d", id + i);        int mark = 1;        for(int i = 1 ; i <= n ; i++) {            if(k > i) k-= i;            else {                mark = i;                break;            }        }        printf("%d\n", id[k]);    }    return 0;}

C:
简单题。统计。

#include <bits/stdc++.h>using namespace std;const int MAXN = 200000 + 5;map<int,int>id, rid;int num[MAXN];int b[MAXN], c[MAXN];int n, m;int main(){    while(scanf("%d", &n) != EOF) {        memset(num, 0, sizeof num);        id.clear();        rid.clear();        int cnt = 0;        for(int i = 1 ; i <= n ; i++) {            int u;  scanf("%d", &u);            if(id[u] == 0) id[u] = ++cnt, rid[cnt]= u;            num[id[u]]++;        }        scanf("%d", &m);        for(int i = 1 ; i <= m ; i++) scanf("%d", b + i);        for(int i = 1 ; i <= m ; i++) scanf("%d", c + i);        int s1, s2;        int ans;        s1 = 0, s2 = 0, ans = 1;        for(int i = 1 ; i <= m ; i++) {            if(num[id[b[i]]] > s1 || (num[id[b[i]]] == s1 && num[id[c[i]]] > s2)) {                s1 = num[id[b[i]]];                s2 = num[id[c[i]]];                ans = i;            }        }        printf("%d\n", ans);    }    return 0;}

D:
刚开始想用讨论写,后来发现讨论情况过于复杂。算了算二分好像可以,就过了。

#include <bits/stdc++.h>using namespace std;#define LL long longconst int MAXN = 100000 + 5;struct Node{    int a, b;    int num;}node[MAXN];bool cmp(Node a, Node b){return a.num < b.num;}int n, k;bool check(LL v){    LL cnt = v;    LL temp = k;    for(int i = 1 ; i <= n ; i++) {        if(cnt * node[i].a <= node[i].b) continue;        else {            temp -= (cnt * node[i].a) - node[i].b;        }        if(temp < 0) return false;    }    return true;}int main(){    while(scanf("%d%d", &n, &k) != EOF) {        for(int i = 1 ; i <= n ; i++) {            scanf("%d", &node[i].a);        }        for(int i = 1 ; i <= n ; i++) {            scanf("%d", &node[i].b);            node[i].num = node[i].b / node[i].a + (node[i].b % node[i].a == 0 ? 0 : 1);        }        sort(node + 1, node + 1 + n, cmp);        LL le = 0, re = 2e9 + 7;        while(le < re - 1) {            LL mid = (le + re) >> 1;            if(check(mid)) le = mid;            else re = mid;//            printf("le = %I64d, re = %I64d, mid = %I64d\n", le, re, mid);        }        LL ans;        if(check(re)) ans = re;        else ans = le;        printf("%I64d\n", ans);    }    return 0;}

E:
模拟链表操作。
赛中忘记判断文件结尾一直T啊,后面加上乱调一下就过了。

#include <bits/stdc++.h>using namespace std;const int MAXN = 500000 + 5;int L[MAXN], R[MAXN];int n, m, p;char str[MAXN], op[MAXN];int match[MAXN];int vis[MAXN];stack<int>s;int main(){    while(scanf("%d%d%d", &n, &m, &p) != EOF) {        scanf("%s", str + 1);        scanf("%s", op);        for(int i = 1 ; i <= n ; i++) {            if(str[i] == '(') s.push(i);            else {                int u = s.top();                match[u] = i;                match[i] = u;                s.pop();            }        }        R[0] = 1, L[n + 1] = n;        for(int i = 1 ; i <= n ; i++) {            L[i] = i - 1; R[i] = i + 1;        }        memset(vis, 0, sizeof vis);        for(int i = 0 ; i < m ; i++) {            if(op[i] == 'L' && L[p] != 0) p = L[p];            else if(op[i] == 'R' && R[p] != n + 1) p = R[p];            else if(op[i] == 'D'){                int u = p, v = match[p];                if(u > v) swap(u, v);//                for(int j = u ; j <= v ; j++) vis[j] = 1;//                printf("   u = %d, v = %d\n", u, v);                int t1, t2;                t1 = L[u], t2 = R[v];                L[t2] = t1, R[t1] = t2;                p = t2;                if(p == n + 1) p = L[p];//                if(u == 1) ok1 = 0;//                if(v == n) okn = 0;            }//            printf("i = %d, p = %d\n", i, p);        }        p = R[0];        while(p < n + 1) {            printf("%c", str[p]);            p = R[p];//            printf("p = %d\n", p);//            system("pause");        }        puts("");//        for(int i = 1 ; i <= n ; i++) if(vis[i] == 0) printf("%c", str[i]);//        puts("");    }    return 0;}

F:
暴力。
首先从小到大枚举一下长度,判断长度合法就退出。
然后注意几个坑点
1.一定存在子串放在开头比较优的情况。
2.当把一定存在子串和表示长度的字符去掉后,只剩下0字符的情况。
写的很乱,不知道有没有好一点的写法。

#include <bits/stdc++.h>using namespace std;const int MAXN = 1000000 + 5;int cnt[20], tcnt[20];char s[MAXN];string ex;bool check(int n, int len){    int temp = n;    int tcnt = 0;    while(temp) {        tcnt++;        temp /= 10;    }    if(len - tcnt != n) return false;    temp = n;    int ok = 1;    while(temp) {        if(cnt[temp % 10] <= 0) ok = 0;        cnt[temp % 10]--;        temp /= 10;    }    if(ok == 1) return true;    else {        temp = n;        while(temp) {            if(cnt[temp % 10] <= 0) ok = 0;            cnt[temp % 10]++;            temp /= 10;        }        return true;    }}int main(){    while(scanf("%s", s) != EOF) {        cin >> ex;        memset(cnt, 0, sizeof cnt);        int len = strlen(s);        for(int i = 0 ; i < len ; i++) {            cnt[s[i] - '0']++;        }        if(cnt[0] == len) {            puts("0");  continue;        }        for(int i = 0 ; i < (int)ex.size();  i++)            cnt[ex[i] - '0']--;        int n;        for(n = 1 ; n <= len ; n++ ) {            if(check(n, len)) break;        }        memcpy(tcnt, cnt, sizeof cnt);//        printf("n = %d\n", n);        string s1, s2;        s1 = "", s2 = "";        for(int i = 1 ; i <= 9 ; i++) {            if(cnt[i]) {//                if(i == ex[0] - '0') {//                    int flag = 1;//                    for(int j = 0 ; j < (int)ex.size() ; j++) {//                        if(ex[j] > ex[0]) {//                            flag = 0;//                            break;//                        }//                        else if(ex[j] < ex[0]) {//                            break;//                        }//                    }//                    if(flag == 0) {////                    }//                }//                else {                    s1 += i + '0';                    cnt[i]--;//                }                break;            }        }        for(int i = 0 ; i <= 9 ; i++) {            if(i >= ex[0] - '0') break;            else {                while(cnt[i]) {                    cnt[i]--;                    s1 += i + '0';                }            }        }        int flag = 1;        for(int i = 0 ; i < (int)ex.size() ; i++) {            if(ex[i] > ex[0]) {                flag = 0;                break;            }            else if(ex[i] < ex[0]) {                break;            }        }//        printf("flag = %d\n", flag);        if(flag == 0) {            for(int i = 0 ; i <= 9 ; i++) {                if(i == ex[0] - '0') {                    while(cnt[i]) {                        s1 += i + '0';                        cnt[i]--;                    }                    break;                }            }        }        s2 += ex;        for(int i = 0 ; i <= 9 ; i++) {            if(i < ex[0] - '0') continue;            else {                while(cnt[i]) {                    cnt[i]--;                    s2 += i + '0';                }            }        }        string ans1 = "", ans2 = "";        if(s1[0] != '0')            ans1 = s1 + s2;        else ans1 = s2 + s1;        ans2 = ex;        for(int i = 0 ; i <= 9 ; i++) {            while(tcnt[i]) {                ans2 += i + '0';                tcnt[i]--;            }        }        if(ans2[0] != '0')        cout << min(ans1, ans2) << endl;        else cout << ans1 << endl;    }    return 0;}
0 0
原创粉丝点击