zoukankan      html  css  js  c++  java
  • CREC 2017

    A:Assignment Algorithm

    #include <bits/stdc++.h>
    using namespace std;
    char s[56][16];
    int a[56][16],n,m,ans=0,A,B,l=0,r=0,ls=0,rs=0;
    int k[19]={15,3,5,2,15,1,4,1,15,2,5,3};
    map<int,int>v;
    void init(){
        v[5]=7;v[7]=5;
        v[3]=9;v[9]=3;
        v[1]=11;v[11]=1;
        v[2]=10;v[10]=2;
    }
    int pos=0,vis=0;
    struct node{
        int val,dis,id;//座位数,记录过道距离,行号
        bool operator<(const node &a) const{
            return a.val==val?(a.dis==dis?a.id>id:a.dis>dis):a.val<val;
        }
    }e[3],p[56];
    void check(int dep){
        int inf=30;
        for(int i=1;i<=11;i++)
            if(inf>k[i] && s[dep][i]=='-'){
                A=dep;
                B=i;
                inf=k[i];
            }
        if(B!=6 && s[A][v[B]]=='-'){
            if(B<6){
                if(ls>rs) B=v[B];
            }else if(B>6){
                if(ls<rs) B=v[B];
            }
        }
    }
    int main(){
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n+3;i++){
            ans=0;
            scanf("%s",s[i]+1);
            for(int j=1;j<=11;j++){
                if(s[i][j]=='-')ans++;
                else if(s[i][j]=='#'){
                    if(j<6) ls++;
                    else if(j>6) rs++;
                }
            }
            if(i==2 || i==n/2+3){
                e[l].val=ans;
                e[l].dis=1;
                e[l++].id=i;
                pos+=ans;
            }
            else{
                p[r].val=ans;
                p[r].dis=min(abs(1-i),min(abs(n/2+2-i),abs(n+3-i)));
                p[r++].id=i;
                vis+=ans;
            }
        }
        for(int i=0;i<pos;i++){
            sort(e,e+l);
            check(e[0].id);
            s[A][B]=(char)('a'+i);
            e[0].val--;
            if(B<6) ls++;
            else if(B>6) rs++;//飞机平衡
        }
        for(int i=pos;i<m;i++){
            sort(p,p+r);
            check(p[0].id);
            s[A][B]=(char)('a'+i);
            p[0].val--;
            if(B<6) ls++;
            else if(B>6) rs++;
        }
        for(int i=1;i<=n+3;i++)
            printf("%s
    ",s[i]+1);
        return 0;
    }
    /*
    2 17
    ...........
    ---.#--.---
    ...........
    ---.---.---
    ...........
    6 26
    ...........
    ---.---.###
    #-#.---.---
    ---.###.---
    ...........
    ---.###.---
    #--.#-#.--#
    #--.--#.#-#
    ...........
    */

    F:Faulty Factorial

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll v[10000006],n,p,r;
    ll quick_pow(ll x,ll y,ll mod){
        ll ans=1;
        while(y){
            if(y&1) ans=ans*x%mod;
            y>>=1;
            x=x*x%mod;
        }
        return ans%mod;
    }
    void init(){
        v[1]=1;
        for(ll i=2;i<=p;i++){
            v[i]=(p-(p/i))*v[p%i]%p;
            //ll re=quick_pow(i,p-2,p);
            //v[i]=re;
        }
    }
    int main(){
        scanf("%lld%lld%lld",&n,&p,&r);
        init();
        /*for(int i=1;i<=100;i++){
            if(v[i]==0) printf("1 ");
            //if(m[i]==0) printf(" 1
    ");
        }*/
        if(n>=2*p){
            if(r==0){
                printf("%lld 1
    ",p);
            }
            else printf("-1 -1
    ");
        }
        else if(n>=p && r){
            ll ans=1;
            for(int i=1;i<=n;i++){
                if(i==p) continue;
                ans=ans*i%p;
            }
            int ok=0;
            for(ll i=1;i<p;i++){
                if(((ans*i)%p)==r){
                    printf("%lld %lld
    ",p,i);
                    ok=1;
                    break;
                }
            }
            if(!ok) printf("-1 -1
    ");
        }
        else if(n>=p && !r){
            int ok=0;
            for(int i=2;i<=n;i++){
                if(i!=p){
                    printf("%d 1
    ",i);
                    ok=1;
                    break;
                }
            }
            if(!ok) printf("-1 -1
    ");
        }
        else if(n<p){
            ll ans=1;
            for(ll i=1;i<=n;i++)
                ans=ans*i%p;
            int ok=0;
            for(ll i=2;i<=n;i++){
                ll q=ans*v[i]%p;
                ll re=r*v[q]%p;
                if(re<i && re>0){
                    printf("%lld %lld
    ",i,re);
                    ok=1;
                    break;
                }
            }
            if(!ok) printf("-1 -1
    ");
        }
        return 0;
    }

    H:Hidden Hierarchy

    #include <bits/stdc++.h>
    #include <set>
    using namespace std;
    #define maxn 50006
    vector<int>v[maxn];
    map<int,string>im;
    map<string,int>mi;
    set<string>ss[maxn];
    int val[maxn],n,x,cnt,ans=0;
    int vis[maxn];
    string s;
    void dfs(int u){
        for(int i=0;i<v[u].size();i++){
            dfs(v[u][i]);
            val[u]+=val[v[u][i]];
        }
    }
    void bfs(int u){
        if(vis[u]) return;
        int pos=0,ok=0;
        for(int i=0;i<v[u].size();i++){
            if(!vis[v[u][i]]){
                pos=max(pos,val[v[u][i]]);
                ok=1;
            }
        }
        if(!ok) cout<<"  "<<im[u]<<" "<<val[u]<<endl;
        else if( ok && pos<x) cout<<"+ "<<im[u]<<" "<<val[u]<<endl;
        else if(ok && pos>=x){
            cout<<"-"<<" "<<im[u]<<" "<<val[u]<<endl;
            for(set<string>::iterator it=ss[u].begin();it!=ss[u].end();it++)
                bfs(mi[*it]);
        }
        return ;
    }
    int main(){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            cin>>s>>x;
            mi[s]=++ans;
            im[ans]=s;
            val[ans]=x;
            vis[ans]=1;
            string fro=s;
            for(int j=s.size()-1;j>=0;j--){
                if(s[j]=='/'){
                    string subs=s.substr(0,j+1);
                    if(!mi[subs]){
                        mi[subs]=++ans;
                        im[ans]=subs;
                        v[ans].push_back(ans-1);
                        ss[ans].insert(fro);
                        fro=subs;
                    }else{
                        v[mi[subs]].push_back(ans);
                        ss[mi[subs]].insert(fro);
                        break;
                    }
                }
            }
        }
        scanf("%d",&x);
        dfs(mi["/"]);
        bfs(mi["/"]);
        return 0;
    }
    /*
    2
    /a/a/a 100
    /b.txt 99
    200
    8
    /b/test/in.a 100
    /b/test/in.b 1
    /c/test/in.a 100
    /c/test/in.b 1
    /c/test/pic/in.a.svg 10
    /c/test/pic/in.b.svg 10
    /a/test/in.a 99
    /a/test/in.b 1
    101
    9
    /sys/kernel/notes 100
    /cerc/problem/a/testdata/in 1000000
    /cerc/problem/a/testdata/out 8
    /cerc/problem/a/luka.cc 500
    /cerc/problem/a/zuza.cc 5000
    /cerc/problem/b/testdata/in 15
    /cerc/problem/b/testdata/out 4
    /cerc/problem/b/kale.cc 100
    /cerc/documents/rules.pdf 4000
    10000
    */

    J:Justified Jungle

    #include <bits/stdc++.h>
    using namespace std;
    int f[1000006],vis[1000006];
    int re[1000006],pos=0;
    int n,x,y;
    vector<int>v[1000006];
    int find(int x){
        return f[x]=f[x]==x?x:find(f[x]);
    }
    int p[1000006],fin[1000006];
    int dfs(int u){
        vis[u]=1;
        int ans=1;
        for(int i=0;i<v[u].size();i++){
            int to=v[u][i];
            if(vis[to]) continue;
            int x=find(u);
            int y=find(to);
            int k;
            if(x!=y){
                k=++pos;
                f[y]=x;
            }
            re[k]=dfs(to);
            ans+=re[k];
            re[k]=min(re[k],n-re[k]);
        }
        return ans;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            f[i]=i;
        for(int i=1;i<n;i++){
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        dfs(1);
        int cou=0;
        for(int i=1;i<=n/2;i++){
            if(n%i) continue;
            int inf=0;
            for(int j=1;j<n;j++){
                if(!(re[j]%i)) inf++;
            }
            if(inf>=((n/i)-1)) fin[cou++]=n/i-1;
        }
        sort(fin,fin+cou);
        for(int i=0;i<cou;i++)
            printf("%d%c",fin[i],i==cou-1?'
    ':' ');
        return 0;
    }
  • 相关阅读:
    人月神话阅读笔记03
    学习进度十六
    计算最长英语链
    学习进度十五
    人月神话阅读笔记02
    找“水王”
    学习进度十四
    用户体验评价
    学习进度十三
    学习进度十二
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/10666896.html
Copyright © 2011-2022 走看看