zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 南京赛区网络预赛

    A An Olympian Math Problem 

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll T,n;
    int main(){
        scanf("%lld",&T);
        while(T--){
            scanf("%lld",&n);
            printf("%lld
    ",n-1);
        }
    }
    View Code

    B The writing on the wall

    C GDY

    D Jerome's House

    E AC Challenge

    #include <bits/stdc++.h>
    using namespace std;
    long long a[25],b[25];
    long long dis[2000005];
    int vis[2000005];
    int pre[25];
    int sta[25];
    int main()
    {
            memset(sta,0,sizeof(sta));
            memset(dis,0,sizeof(dis));
            memset(vis,0,sizeof(vis));
            int n;
            scanf("%d",&n);
            
            for(int i = 0;i < n;++i){
                scanf("%lld%lld%d",&a[i],&b[i],&pre[i]);
                int p;
                for(int j = 0;j < pre[i];++j){
                    scanf("%d",&p);
                    sta[i] |= (1<<(p-1));
                }
                //cout << sta[i] << endl;
            }
            int now = 0;
            queue<int> Q;
            while(!Q.empty()) Q.pop();
            Q.push(0);
            while(!Q.empty()){
                now = Q.front();
                Q.pop();
                vis[now] = 0;
                for(int i = 0;i < n;++i){
                    if((sta[i] & now) == sta[i] && ((1<<i) & now) == 0){
                        int nxt = now | (1<<i);
                        int cnt = 0;
                        for(int j = 0;j < n;++j) if((1<<j)&nxt) cnt++;
                        if(dis[nxt] < dis[now] + cnt*a[i] + b[i]){
                            dis[nxt] = dis[now] + cnt*a[i] + b[i];
                            if(!vis[nxt]) Q.push(nxt),vis[nxt] = 1;
                        }
                    }
                }
            }
            int up = (1<<n);
            long long ans = 0;
            for(int i = 0;i < up;++i) ans = max(ans,dis[i]);
            cout << ans << endl;
            return 0;
    }
    View Code

    F An Easy Problem On The Trees

    G Lpl and Energy-saving Lamps

    H Set

    I Skr

    J Sum

    #include <bits/stdc++.h>
    using namespace std;
    #define N 20000006
    int prime[N],tag[N];
    int get_prime(int n){
        int tot = 0;
        for(int i = 2;i <= n;++i){
            if(!tag[i]) prime[tot++] = i;
            for(int j = 0;j < tot && 1LL * prime[j] * i <= n;++j){
                tag[i * prime[j]] = 1;
                if(i % prime[j] == 0) break;
            }
        }
        return tot;
    }
    
    int cnt;
    int ct;
    int dfs(int now,int n){
        ct++;
        if(n == 0) return 0;
        if(now == cnt || prime[now] > n) return 1;
        if(prime[now]*prime[now] > n){
            int tmp = (upper_bound(prime,prime+cnt,n)-prime)-now;
            return tmp*2+1;
        }
        int ans = 0;
        ans += dfs(now+1,n/(1LL*prime[now]*prime[now]));
        ans += 2*dfs(now+1,n/prime[now]);
        ans += dfs(now+1,n);
        return ans;
    }
    
    
    int main()
    {
        cnt = get_prime(20000000);
        int T;
        scanf("%d",&T);
        while(T--){
            int n;
            scanf("%d",&n);
            ct = 0;
            printf("%d
    ",dfs(0,n));
            //cout << ct << endl;
        }
        return 0;
    }
    View Code

    K The Great Nim Game

    L Magical Girl Haze 

    #include <bits/stdc++.h>
    using namespace std;
    #define M 200005
    #define N 100005
    int head[N];
    bool vis[N][11];
    long long dis[N][11];
    int cnt;
    
    struct Edge{
        int to,next,l;
    }edge[M<<1];
    
    void ad(int u,int v,int c){
        edge[cnt].to = v,edge[cnt].next = head[u],edge[cnt].l = c,head[u] = cnt++;
    }
    struct Node{
        int p,tim;
        long long dis;
        bool operator < (const Node &a)const{
            return dis > a.dis;
        }
    };
    priority_queue<Node> Q;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            cnt = 0;
            memset(head,-1,sizeof(head));
            memset(dis,0x3f,sizeof(dis));
            memset(vis,0,sizeof(vis));
            int n,m,k;
            int u,v,c;
            scanf("%d%d%d",&n,&m,&k);
            for(int i = 1;i <= m;++i){
                scanf("%d%d%d",&u,&v,&c);
                ad(u,v,c);
            }
            dis[1][0] = 0;
            while(!Q.empty()) Q.pop();
            Node nd;
            nd.p = 1,nd.tim = 0,nd.dis = dis[1][0];
            Q.push(nd);
            long long l;
            while(!Q.empty()){
                nd = Q.top();
                Q.pop();
                int u = nd.p,tim = nd.tim;
                if (vis[u][tim]) continue;
                vis[u][tim] = 1;
                for(int i = head[u];i != -1;i = edge[i].next){
                    v = edge[i].to;
                    l = edge[i].l;
                    if(tim + 1 <= k){
                        if(!vis[v][tim+1] && dis[v][tim+1] > dis[u][tim]){
                            dis[v][tim+1] = dis[u][tim];
                            nd.p = v,nd.tim = tim+1,nd.dis = dis[v][tim+1];
                            Q.push(nd);
                        }
                    }
                    if(!vis[v][tim] && dis[v][tim] > dis[u][tim] + l){
                        dis[v][tim] = dis[u][tim] + l;
                        nd.p = v,nd.tim = tim,nd.dis = dis[v][tim];
                        Q.push(nd);
                    }
                }
            }
            long long ans = 0x3f3f3f3f3f3f3f3f;
            for(int i = 0;i <= k;++i) ans = min(ans,dis[n][i]);
            cout << ans << endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    【leetcode刷题笔记】Best Time to Buy and Sell Stock II
    【leetcode刷题笔记】Reverse Integer
    JAVA中的NIO(二)
    标准I/O
    margin的理解
    JAVA中的NIO(一)
    IO模型
    linux网络命令
    linux用户管理命令
    linux中的帮助命令
  • 原文地址:https://www.cnblogs.com/solvit/p/9651897.html
Copyright © 2011-2022 走看看