zoukankan      html  css  js  c++  java
  • Codeforces Round #565 (Div. 3) (重现赛个人题解)

    1176A. Divide it!

    题目链接:http://codeforces.com/problemset/problem/1176/A

    题意:

    给定一个数字 (n) 和三种操作

    1. 如果 n 能被 2 整除则 (n /= 2)
    2. 如果 n 能被 3 整除 (n = frac{2n}3)
    3. 如果 n 能被 5 整除 (n = frac{4n}5)

    求问 (n) 最少执行多少次能变成 (1) ,如果不行则输出 (-1)

    //搜索
    // Author : RioTian
    // Time : 20/10/15
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll _, n, cnt;
    void dfs(ll x, ll step) {
        if (x == 1) {
            cnt = min(step, cnt);
            return;
        }
        if (x % 2 == 0)
            dfs(x / 2, step + 1);
        else if (x % 3 == 0)
            dfs(x * 2 / 3, step + 1);
        else if (x % 5 == 0)
            dfs(x * 4 / 5, step + 1);
        else
            cnt = -1;
    }
    int main() {
        // freopen("in.txt", "r", stdin);
        ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
        cin >> _;
        while (_--) {
            cin >> n, cnt = 9999999;
            if (n == 1)
                cnt = 0;
            else
                dfs(n, 0);
            cout << cnt << endl;
        }
    }
    
    //math
    #include <bits/stdc++.h>
    using namespace std;
    int64_t n, i, q;
    int main() {
        for (cin >> q; q--;) {
            cin >> n;
            for (i = 0; n > 1 && i < 200; i++)
                n % 2 == 0
                    ? n /= 2
                    : n % 3 == 0 ? n = 2 * n / 3 : n % 5 == 0 ? n = 4 * n / 5 : 0;
            cout << (n > 1 ? -1 : i) << endl;
        }
    }
    

    1176B.Merge it!

    题目链接:http://codeforces.com/problemset/problem/1176/B

    题意:给定序列,任意俩个元素可以相加成一个元素,求序列元素能被3整除的最大数量。

    思路: 对于所有元素进行 模3 的预处理,然后 贪心 余数1 和 余数2 的配对,剩下的 3个 一组配对。

    AC代码:

    // Author : RioTian
    // Time : 20/10/15
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
        // freopen("in.txt", "r", stdin);
        ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
        int T;
        scanf("%d", &T);
        while (T--) {
            int n, t, a[3] = {0};
            scanf("%d", &n);
            for (int i = 0; i < n; i++) {
                scanf("%d", &t);
                a[t % 3]++;
            }
            printf("%d
    ", a[0] + min(a[1], a[2]) +
                               (max(a[1], a[2]) - min(a[1], a[2])) / 3);
        }
    }
    

    1176C. Lose it!

    题目链接:https://codeforces.com/problemset/problem/1176/C

    题意:保证这个顺序 4,8,15,16,23,42 ,删除其他多余的数据,计算要删除多少个数字,才能保证剩下的数字能组成n套这样的(n≥1);

    题解:遍历序列,如果这个数为n,且这个数前面的数字为1,则b[n++],b[前面那个数字]–。
    例子:
    12
    4 8 4 15 16 8 23 15 16 42 23 42
    遍历这个序列:
    第一个数字是4,则b[4++];
    第二个数字是8,则b[8++],b[4–];因为顺序是规定的,所以有8,一定有4。
    第三个数字是4,则b[4++];
    第四个数字是15,则b[15++],b[8–];
    第五个数字是16,则b[16++],b[15–];如果有16一定有15,所以可以用16代替前面的所有数字。
    以此类推。(建议在纸上画一下就可以理解了。)

    // Author : RioTian
    // Time : 20/10/15
    #include <bits/stdc++.h>
    #define ms(a, b) memset(a, b, sizeof a)
    using namespace std;
    typedef long long ll;
    const int N = 5e5 + 100;
    int n, m, a[N], ans[] = {4, 8, 15, 16, 23, 42}, vis[10];
    map<int, int> mp;
    void init() {
        mp[4] = 1; mp[8] = 2;
        mp[15] = 3; mp[16] = 4;
        mp[23] = 5; mp[42] = 6;
        ms(vis, 0);
    }
    int main() {
        //freopen("in.txt", "r", stdin);
        ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
        while (cin >> n) {
            init();
            for (int i = 1; i <= n; i++) {
                cin >> m;
                if (mp[m] == 1)
                    vis[1]++;
                else if (vis[mp[m] - 1] > 0) {
                    vis[mp[m] - 1]--;
                    vis[mp[m]]++;
                }
            }
            if (n < 6) cout << n << endl;
            else cout << n - vis[6] * 6 << endl;
        }
        return 0;
    }
    

    1176D. Recover it!

    https://codeforces.com/problemset/problem/1176/D

    题意:给出b[n],按照一定的规则变成a[n];
    题解:
    原理是:倒推,原本题意是,由a[n]变成b[n];
    遍历:
    如果a[n]是质数,那么在b[n]中,保留a[n]并且加上质数表中的第a[n]个质数;
    如果a[n]是合数,那么在b[n]中,保留a[n]并且加上b[n]的最大除数。

    #include <bits/stdc++.h>
    using namespace std;
    #define N 3000000
    int n, i, j, k, x, p[N], q[N], c[N], b[N];
    int main() {
        for (i = 2; i < N; i++)
            if (!p[i]) {
                q[++k] = i;
                for (j = i + i; j < N; j += i) p[j] = 1;
            }
        for (cin >> n, i = 0; i < n + n;) cin >> b[i], c[b[i++]]++;
        sort(b, b + n + n);
        for (i = n + n - 1; i + 1; i--) {
            x = b[i];
            if (c[x] <= 0 || !p[x]) continue;
            for (j = 2; x % j; j++)
                ;
            cout << x << " ", c[x]--, c[x / j]--;
        }
        for (i = 0; i < n + n; i++)
            if (x = b[i], c[x] > 0) cout << x << " ", c[x]--, c[q[x]]--;
        return 0;
    }
    

    1176E.Cover it! - bfs

    https://codeforc.es/contest/1176/problem/E

    https://www.cnblogs.com/Yinku/p/11217093.html

    久了不写bfs了。一开始用dfs写,的确用dfs是很有问题的,一些奇怪的情况就会导致多染一些色。

    注意无向图的边要开双倍。

    //DFS 修改以后AC的代码
    #include<bits/stdc++.h>
    const int maxn = 2e5+10;
    using namespace std;
    vector<int> V[maxn],ans[2];
    int n,m;
    int T;
    int vis[maxn];
    void dfs(int u,int ind) {
    	vis[u]=1;
    	ans[ind].push_back(u);
    	for(auto nx:V[u]) {
    		if(vis[nx]) continue;
    		dfs(nx,ind^1);
    	}
    	return;
    }
    int main() {
    	scanf("%d",&T);
    	while(T--) {
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=n;++i) {V[i].clear();vis[i]=0;}
    		ans[0].clear();ans[1].clear();
    		for(int i=1;i<=m;++i) {
    			int a,b;
    			scanf("%d%d",&a,&b);
    			V[a].push_back(b);
    			V[b].push_back(a);
    		}
    		dfs(1,0);
    		if(ans[0].size()>ans[1].size()) {
    			swap(ans[0],ans[1]);
    		}
    		printf("%lu
    ",ans[0].size());
    		for(auto x:ans[0]) printf("%d ",x);
    		puts("");
    	}
    	return 0;
    }
    
  • 相关阅读:
    display ntp-service sessions
    display ntp-service status
    MySQL与telnet安装
    YL_组播_IGMPv2-v3
    YL_组播_PIM-DM协议原理
    YL_组播_IGMP协议原理
    IIS发布站点问题
    css 定位及遮罩层小技巧
    MYSQL查询某字段中以逗号分隔的字符串的方法
    零度
  • 原文地址:https://www.cnblogs.com/RioTian/p/13823560.html
Copyright © 2011-2022 走看看