Codeforces Round #479 (Div. 3) 部分题解

看到F题没有思路的我螺旋爆炸弱。

A
模拟题。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    while(k > 0 && n) {
        if(n % 10) {
            n--; k--;
        } else {
            n /= 10; k--;
        }
    }
    printf("%d\n",n);
    return 0;
}

B
模拟题。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;

int n;
char bbf[10];
int main(){
    cin>>n;
    string buf; cin>>buf;
    int len = buf.size();
    map< string , int >mmp;
    for(int i = 0; i < len - 1; i++) {
        string bb = "";
        bb = bb + buf[i];
        bb = bb + buf[i+1];
        if(mmp.find(bb) != mmp.end()) {
            mmp[bb]++;
        } else {
            mmp[bb] = 1;
        }
    }
    string x = (mmp.begin())->first;
    for(auto i = mmp.begin(); i != mmp.end(); i++) {
        if(i->second > mmp[x]) {
            x = i->first;
        }
    }
    cout<<x<<endl;

    return 0;
}

C
排序。模拟题。

弄清楚题意。例如1 3 3 3,不可能存在正好有两个元素小于它的x,因为这里要么就是0个,要么就是1个,要么就是4个。

k = 0要特判,因为对于1 3 3 3这样的输入,k = 0时不可能输出1(因为这样就是1个元素了),但是对于「任意大于1的数 其他大于1的数 其他大于1的数 …」这样都输入就可以输出1,因为正好就是只有0个元素小于等于1。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

int n,k;
int a[200005];
int res[200005]; int resp;

int main() {
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }

    int l = 0, r = 0;
    sort(a,a+n);
    if(k == 0) {
        if(a[0] == 1) {
            printf("-1\n");
            goto leave;
        } else {
            printf("1\n");
            goto leave;
        }
    }
    while(r < n) {
        while(r < n && a[r] == a[l]) {
            r++;
        }
        res[resp] = res[resp-1] + (r - l);
        resp++;
        l = r;
    }
    for(int i = 0; i < resp; i++) {
        if(res[i] == k) {
            printf("%d\n",a[k-1]);
            goto leave;
        }
    }
    printf("-1\n");
 leave:;
    return 0;
}

D
对于题目给出的任意一个数 x 都可以设为 x = 2 a 3 b k 。整个过程中, b 越来越小, a 越来越大。按这样的规则进行排序。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;

int n;
ll a[105];
bool cmp(ll a, ll b) {
    int cnt2a = 0, cnt2b = 0, cnt3a = 0, cnt3b = 0;
    ll a2 = a, b2 = b, a3 = a, b3 = b;
    while(a2&&a2%2 == 0) {
        a2 >>= 1, cnt2a++;
    }
    while(b2&&b2%2 == 0) {
        b2 >>= 1, cnt2b++;
    }
    while(a3&&a3%3 == 0) {
        a3 /= 3, cnt3a++;
    }
    while(b3&&b3%3 == 0) {
        b3 /= 3, cnt3b++;
    }
    return
        (cnt3a > cnt3b)
        || (cnt3a == cnt3b && cnt2a < cnt2b)
        ;
}
int main(){
    scanf("%d",&n);
    for(int i = 0; i < n; i ++) {
        scanf("%lld",&a[i]);
    }
    sort(a,a+n,cmp);
    for(int i = 0; i < n; i++) {
        printf("%lld%c",a[i],i==n-1?'\n':' ');
    }
    return 0;
}

E
注意到一个cycle中的所有点的度都为2。枚举所有度为2的点,做bfs。假如bfs中遇到度不为2的点,则这个联通分量不是一个cycle。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;

int n,m;
struct e { int to, next; } es[400005]; int ep = 1;
int head[200005];
int deg[200005];
bool vis[200005];
void adde(int from, int to) {
    es[ep].to = to;
    es[ep].next = head[from];
    head[from] = ep;
    ep++;
}
bool bfs(int stp) {
    queue< int >ws;
    ws.push(stp);
    bool flag = true;
    while(!ws.empty()) {
        int pivot = ws.front(); ws.pop();
        if(vis[pivot])continue;
        if(deg[pivot]!=2){
            flag = false;
        }
        for(int x = head[pivot]; x != 0; x = es[x].next) {
            ws.push(es[x].to);
        }
        vis[pivot] = true;
    }
    return flag;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i = 0;i < m;i++) {
        int a,b;scanf("%d%d",&a,&b);
        adde(a,b);
        adde(b,a);
        deg[a]++;
        deg[b]++;
    }
    int res = 0;
    for(int i = 0; i < n; i++) {
        if(deg[i] == 2 && !vis[i]) {
            if(bfs(i)) {
                res++;
            }
        }
    }
    printf("%d\n",res);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/erikabeats/article/details/80224741