zoukankan      html  css  js  c++  java
  • Codeforces Round #655 (Div. 2)ABC(B为数学)

    A:http://codeforces.com/contest/1372/problem/A

    解析:

    没得说,没想到这次A这么简单,全输出1就行了

    #include<cstdio>
    #include<stack>
    #include<map>
    #include<set>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD 
    typedef long long ll;
    const int maxn=1e3+20;
    int a[maxn],b[maxn];
    int pos[maxn];
    int top=0;
    int ok=0;
    int vis[maxn];
        int n,k;
    struct node
    {
        int x,id;
    }st[maxn];
    bool cmp(node a , node b)
    {
        if(a.x==b.x)
            return a.id<b.id;
        return a.x<b.x;
    }
    bool check()
    {
        for(int i=1;i<n;i++)
        {
            if(a[i]>a[i+1])
                return true;
        }
        return false;
    }
    int main()
    {    // 4 0 20
    
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            for(int i=1;i<=n;i++)
                cout<<"1 ";
                cout<<endl;
        }
    }

    B:http://codeforces.com/contest/1372/problem/B

    题意:

    给出n

    找出a,b。满足a+b=n,lcm(a,b)是最小的

    解析:

    a*b/gcd(a,b)=lcm(a,b)

    lcm最小,那么gcd最大

    如果a,b互质,那么gcd为1,所以对于n为非素数的情况,需要找出n的最大因子a

    a为n的因子,那么n-a也为n的因子

    满足了:

    max gcd=gcd(a,n-a)=a

    min  lcm=lcm(a,n-a)=n-a

    #include<cstdio>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD 
    typedef long long ll;
    const int maxn=1e3+20;
    int a[maxn],b[maxn];
    int pos[maxn];
    int top=0;
    int ok=0;
    int vis[maxn];
        int n,k;
    struct node
    {
        int x,id;
    }st[maxn];
    bool cmp(node a , node b)
    {
        if(a.x==b.x)
            return a.id<b.id;
        return a.x<b.x;
    }
    int main()
    {    // 4 0 20
        int t;
        cin>>t;
        while(t--)
        {
            ll n;
            cin>>n;
            int ok =  0;
            ll md;
            for(int i=2;i<=sqrt(n);i++)
            {
                if(n%i==0)
                {
                    md=n/i;ok=1;break;
                }
            }
            if(!ok)
                cout<<"1 "<<n-1<<endl;
            else
                cout<<md<<" "<<n-md<<endl;
        }
    
    }

    C:http://codeforces.com/contest/1372/problem/C

    题意:

    给出长度为n的数组,含数字1~n

    操作:

    找出[l,r],对区间内的数字进行任意排序,条件是任何一位不能和排序之前相同

    求最少操作数,使得数组变为:1,2,3....n

    解析:

    求初始数组ai==i的数目tot

    tot==n:0

    tot==0:1(此时对整个区间进行一次排序即可恢复)

    0<tot<n:

    分两种情况

    (1) 正常...乱序...正常

    这个时候,只需要把乱序部分进行一次排序,即可恢复,所以只需要1次操作。

    (2)正常...乱序正常乱序...正常

    中间发生了交替,那么先把整个区间进行一次操作,打乱它们,然后再对整个区间重排,即可恢复。操作数为2次。

    #include<cstdio>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD 
    typedef long long ll;
    const int maxn=2e5+20;
    int a[maxn],b[maxn];
    int pos[maxn];
    int top=0;
    int ok=0;
    int vis[maxn];
        int n,k;
    struct node
    {
        int x,id;
    }st[maxn];
    bool cmp(node a , node b)
    {
        if(a.x==b.x)
            return a.id<b.id;
        return a.x<b.x;
    }
    int main()
    {    // 4 0 20
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            int ok = 0;
            int tot=0;
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
                if(a[i]!=i)
                    {
                        tot++;
                    }
            }
            if(tot==0)
                cout<<"0"<<endl;
            else if(tot==n)
                cout<<"1"<<endl;
            else
                {
                    int l=1,r=n;
                    for(int i=1;i<=n;i++)
                    {
                        if(a[i]!=i)
                            break;
                        l++;
                    }
                    for(int i=n;i>=1;i--)
                    {
                        if(a[i]!=i)
                            break;
                        r--;
                    }
                    int ok =0;  // l之前,r之后,均为有序。
                    for(int i=l+1;i<=r-1;i++)
                    {
                        if(a[i]==i)
                        {
                            ok=1;break;
                        }
                    }
                //    cout<<l<<"-"<<r<<endl;
                    if(ok)
                        cout<<"2"<<endl;
                    else
                        cout<<"1"<<endl;
                }
        }
    
    }
  • 相关阅读:
    【2017中国大学生程序设计竞赛
    【hdu 4333】Revolving Digits
    【hihocoder 1554】最短的 Nore0061
    【2017中国大学生程序设计竞赛
    【Codeforces Beta Round #88 C】Cycle
    【2017 Multi-University Training Contest
    【Codeforces Round #429 (Div. 2) C】Leha and Function
    【Codeforces Round #429 (Div. 2) B】 Godsend
    【Codeforces Round #429 (Div. 2) A】Generous Kefa
    Single-stack real-time operating system for embedded systems
  • 原文地址:https://www.cnblogs.com/liyexin/p/13290390.html
Copyright © 2011-2022 走看看