zoukankan      html  css  js  c++  java
  • codeforces gym-101078

    题目链接:

    http://codeforces.com/gym/101078

    A:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    #include <map>
     
    using namespace std;
     
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    #define ll long long;
    typedef  long long LL;
     
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
     
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const LL inf=1e18;
    const int N=1e6+2000;
    const int maxn=1e5+5;
    const double eps=1e-8;
    
    int a[maxn],p[maxn];
    int main()
    {
        int t;
        read(t);
        while(t--)
        {
            int n;
            read(n);
            For(i,1,n)
            {
                read(a[i]);
                p[a[i]]=i;
            }
            int st=0,mmax=0,x;
            For(i,1,n)
            {
                read(x);
                mmax=max(mmax,p[x]);
                if(i==mmax)
                {
                    printf("%d-%d ",st+1,i);
                    st=i;
                }
            }
            printf("
    ");
        } 
        return 0;
    }
    
    /*
    题意:
    给两个[1,n]的排列,现在要给分成几部分,每一部分里面都是数字相同,现在要怎么分;
    
    思路:
    
    水题啦啦;
    */
    

      

    B:

    C:

    D:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    #include <map>
     
    using namespace std;
     
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    #define ll long long;
    typedef  long long LL;
     
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
     
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const LL inf=1e18;
    const int N=1e6+2000;
    const int maxn=5e3+10;
    const double eps=1e-8;
    
    int main()
    {
        int t;
        read(t);
        while(t--)
        {
            LL n;
            read(n);
            if(n==0){cout<<"0
    ";continue;}
            LL ans=n-n/2;
            for(int i=1;i<=3;i++)
            {
                if((n+i-1)%3==0)
                {
                    LL t=(n+i-1)/3;
                    if(t%2==0)t++;
                    ans=ans+(n-t)/2+1;
                    break;
                }
            }
            print(ans);
        }    
        return 0;
    }
    
    /*
    题意:
    每个数m和2*m之间都有一根绳,每个奇数m和3*m+1之间有一根绳,现在要把[1,n]拿走,需要剪断多少根绳;
    
    思路:
    
    这个就是个水题,把2*m>n的减去,把3*m+1>n的剪去就是答案了;
    */
    

      

    E:

    F:

    G:

    H:

    I:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    #include <map>
     
    using namespace std;
     
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    #define ll long long;
    typedef  long long LL;
     
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
     
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const LL inf=1e18;
    const int N=1e6+2000;
    const int maxn=1e6+5;
    const double eps=1e-8;
    
    char s[maxn];
    int p,sz;
    struct node
    {
        char ch;
        int l,r;
    }po[N];
    void movele()
    {
        if(p==0)return ;
        p=po[p].l;
    }
    void moveri()
    {
        if(po[p].r==0)return ;
        p=po[p].r;
    }
    void insert(char &t)
    {
        sz++;
        po[sz].ch=t;
        po[sz].l=p;
        po[sz].r=po[p].r;
        po[p].r=sz;
        if(po[sz].r)po[po[sz].r].l=sz;
        p=sz;
    }
    void dele()
    {
        if(p==0)return ;
        if(po[p].r)
        {
            int nex=po[p].r;
            int pre=po[p].l;
            po[nex].l=pre;
            po[pre].r=nex;
            p=pre;
        }
        else 
        {
            int pre=po[p].l;
            po[pre].r=0;
            p=pre;
        }
    }
    void out()
    {
        p=po[0].r;
        while(p)
        {
            printf("%c",po[p].ch);
            p=po[p].r;
        }
        printf("
    ");
    }
    int main()
    {
        int t;
        read(t);
        while(t--)
        {
            gets(s);
            int len=strlen(s);
            sz=0;p=sz;
            po[0].l=0;po[0].r=0;
            for(int i=0;i<len;i++)
            {
                if(s[i]=='<')movele();
                else if(s[i]=='>')moveri();
                else if(s[i]=='-')dele();
                else insert(s[i]);
            }
            out();
        }
        return 0;
    }
    
    /*
    题意:
    模拟几项操作,最后输出密码,其中<表示光标左移一位,>表示右移一位,-表示删除一位,其他的字符就表示插入一个字符,
    这些操作都是在可以操作的情况下才执行;
    
    思路:
    
    用一个双向链表模拟一下,我不太会写链表,就用结构体代替啦;
    */
    

      

    J:

    K:

    L:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    #include <map>
     
    using namespace std;
     
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    #define ll long long;
    typedef  long long LL;
     
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
     
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const LL inf=1e18;
    const int N=1e6+2000;
    const int maxn=5e3+10;
    const double eps=1e-8;
    
    char s[maxn];
    int main()
    {
        scanf("%s",s);
        int len=strlen(s);
        double ans=0;
        for(int i=len-1;i>=0;i--)
        {
            if(s[i]=='0')
            {
                for(int j=0;j<=i;j++)
                {
                    if(s[j]=='1')
                    {
                        swap(s[i],s[j]);
                        ans=ans+sqrt(i-j);
                        break;
                    }
                }
            }
        }
        printf("%.12lf
    ",ans);
        return 0;
    }
    
    /*
    题意:
    给出一个01串,让把0都换到前边来,每次交换位置i和j的花费为sqrt(i-j);问最小的花费是多少;
    
    思路:
    假设现在位置i<j<x<y,i,j为1,x,y为1,sqrt(x-j)+sqrt(y-i)<sqrt(x-i)+sqrt(y-j),
    这个大小关系可以通过平方啊比较出来,然后就是最外面的10一块交换花费最小,所以就这样贪心就好;
    */
    

      

      

  • 相关阅读:
    Java 多态
    Java 继承与抽象类
    Java 接口
    关于Oracle数据库故障诊断基础架构
    监控性能
    监视错误和警报
    内存管理参考
    使用自动内存管理
    内存架构概述
    关于内存管理
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5853657.html
Copyright © 2011-2022 走看看