zoukankan      html  css  js  c++  java
  • codeforces-1176 (div3)

    打div3翻车了

    A.第一个操作是除二,第二个操作视为两下操作之后除三,第三个操作视为三下操作之后除五,直接计算贡献

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 110;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    LL N;
    int main(){
        int T; Sca(T);
        while(T--){
            Scl(N);
            int ans = 0;
            while(!(N % 2)){
                N /= 2;
                ans++;
            }
            while(!(N % 3)){
                N /= 3;
                ans += 2;
            }    
            while(!(N % 5)){
                N /= 5;
                ans += 3;
            }
            if(N != 1) ans = -1;
            Pri(ans);
        } 
        return 0;
    }
    A

    B.毫无疑问先把所有数模3,整除的直接计入贡献,余1的找余2的凑一对计入贡献,最后剩下的三个凑一对计入贡献

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 1010;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    int a[maxn];
    int b[maxn];
    int main(){
        int T; Sca(T);
        while(T--){
            Sca(N);
            b[0] = b[1] = b[2] = 0;
            for(int i = 1; i <= N ; i ++){
                Sca(a[i]);
                a[i] %= 3;
                b[a[i]]++;
            } 
            if(b[1] > b[2]) swap(b[1],b[2]);
            Pri(b[0] + b[1] + (b[2] - b[1]) / 3);
        }
        return 0;
    }
    B

    C.比较套路的一个寻找子序列数量,开6个计数器即可。最后答案就是字符串长度len - 匹配成功的子序列数量 * 6

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 5e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    int a[maxn];
    const int b[10] = {0,4,8,15,16,23,42};
    int dp[maxn];
    int main(){
        Sca(N);
        for(int i = 1; i <= N ; i ++) Sca(a[i]);
        dp[0] = INF;
        for(int i = 1; i <= N ; i ++){
            for(int j = 1; j <= 6; j ++){
                if(b[j] == a[i] && dp[j - 1]){
                    dp[j - 1]--;
                    dp[j]++;
                }
            }
        }
        Pri(N - dp[6] * 6);
        return 0;
    }
    C

    D.将所有数从大到小排序然后扫描,遇到的当前最大的数如果是素数说明是一个小素数变过来的,否则说明他要变成他最大的因子。

    直接递推即可。

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 3e6 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    int a[maxn];
    int prime[maxn];
    int pos[maxn];
    bool isprime[maxn];
    void init(){
        for(int i = 2 ; i <= 2750131; i ++) isprime[i] = 1;
        int cnt = 0;
        for(int i = 2 ; i <= 2750131; i ++){
            if(!isprime[i]) continue;
            prime[++cnt] = i;
            pos[i] = cnt;
            for(int j = i + i; j <= 2750131; j += i) isprime[j] = 0;
        }
    }
    int delnum[maxn];
    int find(int x){
        for(int i = 2; i <= x; i ++){
            if(!(x % i)) return max(i,x / i);
        }
        return 1;
    }
    int main(){
        Sca(N); init();
        for(int i = 1; i <= N * 2 ; i ++) Sca(a[i]);
        sort(a + 1,a + 1 + N * 2);
        for(int i = N * 2; i >= 1; i --){
            if(delnum[a[i]]){
                delnum[a[i]]--;
                continue;
            }
            if(isprime[a[i]]){
                delnum[pos[a[i]]]++;
                printf("%d ",pos[a[i]]);
            }else{
                int n = find(a[i]);
                delnum[n]++;
                printf("%d ",a[i ]);
            }
        }
        return 0;
    }
    D

    E.一看是个最小点覆盖,仔细看看发现没有要求最小,只是找一个点覆盖。

    对原图进行一手黑白染色,然后白点集合和黑点集合必定有一个符合答案,取集合元素数量较小的那个集合输出。

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x);  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x);  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 2e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    struct Edge{
        int to,next;
    }edge[maxn * 2];
    int head[maxn],tot;
    int color[maxn];
    vector<int>w[2];
    void init(){
        for(int i = 0 ; i <= N ; i ++){
             color[i] = head[i] = -1;
        }
        w[0].clear(); w[1].clear();
        tot = 0;
    }
    void add(int u,int v){
        edge[tot].to = v;
        edge[tot].next = head[u];
        head[u] = tot++;
    }
    void dfs(int t){
        for(int i = head[t]; ~i ; i = edge[i].next){
            int v = edge[i].to;
            if(color[v] != -1) continue;
            color[v] = 1 ^ color[t];
            dfs(v);
        }
    }
    int main(){
        int T; Sca(T);
        while(T--){
            Sca2(N,M); init();
            for(int i = 1; i <= M ; i ++){
                int u,v; Sca2(u,v);
                add(u,v); add(v,u);
            }
            for(int i = 1; i <= N ; i ++){
                if(color[i] == -1){
                    color[i] = 0;
                    dfs(i);
                }
            }
            for(int i = 1; i <= N ; i ++) w[color[i]].push_back(i);
            if(w[0].size() > w[1].size()) swap(w[0],w[1]);
            Pri(w[0].size());
            for(int i = 0 ; i < w[0].size(); i ++){
                printf("%d ",w[0][i]);
            }
            puts("");
        }
        return 0;
    }
    E
  • 相关阅读:
    Tsql 获取服务器信息
    数据字典生成脚本 【转载】
    c# winform文本框数字,数值校验
    ReentrantLock和AbstractQueuedSynchronizer的分析
    多线程
    前缀和与差分数组
    链表
    堆(优先队列)
    排序算法
    二分查找(递归和非递归)
  • 原文地址:https://www.cnblogs.com/Hugh-Locke/p/11140861.html
Copyright © 2011-2022 走看看