• Codeforces Round #613题解


    A题 

    签到水题

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<cstdio>
    using namespace std;
    const int N=105;
    int main(){
        int n;
        string s;
        cin>>n;
        cin>>s;
        int i;
        int num1=0,num2=0;
        for(i=0;i<s.size();i++){
            if(s[i]=='L')
            num1++;
            else
            num2++;
        }
        cout<<num2+num1+1<<endl;
    }
    View Code

    B题

    由题意只需要求出一段长度和最大值即可,但是不能是全部长度,可以将它转化为在1--n-1和2--n求。

    注意答案可能负数,大数据建议开long long

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    int s[N];
    int main(){
        int t;
        cin>>t;
        while(t--){
            memset(s,0,sizeof s);
            int p[N];
            int n;
            cin>>n;
            int i;
            ll sum=0;
            for(i=1;i<=n;i++){
                cin>>p[i];
                sum+=p[i];
            }
        ll flag=0;
            ll ans=-inf;
            for(i=1;i<=n-1;i++){
                flag+=p[i];
                ans=max(ans,flag);
                if(flag<0){
                  flag=0;
                }
            }
            flag=0;
            for(i=2;i<=n;i++){
                flag+=p[i];
                ans=max(ans,flag);
                
                if(flag<0){
                  flag=0;
                }
            }
            if(sum>ans)
            cout<<"YES"<<endl;
            else
            cout<<"NO"<<endl; 
        }
    }
    View Code

    C题

    求最小公倍数是否为X,注意思路转化,如果暴力求解每两个数的最小公倍数会超时。

    根据公式定义 lcm(a,b)=a/gcd(a,b)*b

    因此可以将a/gcd(a,b)当作枚举变量

    注意输入数据可能为素数

    另外,判断素数需要加速,否则会TLE,学到了一个新招叫做六素数法

    原理:每个数都可以表述为6n,6n+1,6n+2,6n+3,6n+4,6n+5且素数只能为6n相邻的两个数。

    官方简单题解:只需枚举X的约数,再判断即可,因为答案必定为两个约数。

    #include <bits/stdc++.h>
    using namespace std;
    #define finish(x) return cout << x << endl, 0
    #define ll long long
    
    ll x;
    
    ll lcm(ll a, ll b){
        return a / __gcd(a, b) * b;
    }
    int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cin >> x;
        ll ans;
        for(ll i = 1 ; i * i <= x ; i++){
            if(x % i == 0 && lcm(i, x / i) == x){
                ans = i;
            }
        }
        cout << ans << " " << x / ans << endl;
    }
    easier implement
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    ll x;
    ll gcd(ll a,ll b){
        return b==0?a:gcd(b,a%b);
    }
    bool isprime(long long x){
        if(x<=3)
        return x>1;
        else{
            if(x%6!=1&&x%6!=5)
            return false;
            else{
                long long k=sqrt(x);
                for(int i =5;i<=k;i+=6){
                    if(x%i==0||x%(i+2)==0)
                        return false;
                }
            }
        }
        return true;
    }
    int main(){
       cin>>x;
       ll i;
       if(x==1||isprime(x))
       cout<<1<<" "<<x<<endl;
       else{
           ll m1=1,m2=x;
        for(i=1;i<=sqrt(x);i++){
            if(x%i!=0)
            continue;
               ll b=x/i;
               if(gcd(b,i)==1){
                   if(b<m2){
                       m2=b;
                       m1=i;
                   }
               }
        }
        cout<<m1<<" "<<m2<<endl;
       }
       
    }
    my Code
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    ll x;
    ll gcd(ll a,ll b){
        return b==0?a:gcd(b,a%b);
    }
    bool isprime(long long x){
        if(x<=3)
        return x>1;
        else{
            if(x%6!=1&&x%6!=5)
            return false;
            else{
                long long k=sqrt(x);
                for(int i =5;i<=k;i+=6){
                    if(x%i==0||x%(i+2)==0)
                        return false;
                }
            }
        }
        return true;
    }
    int main(){
       cin>>x;
       ll i;
       if(x==1||isprime(x))
       cout<<1<<" "<<x<<endl;
       else{
           ll m1=1,m2=x;
        for(i=1;i<=sqrt(x);i++){
            if(x%i!=0)
            continue;
               ll b=x/i;
               if(gcd(b,i)==1){
                   if(b<m2){
                       m2=b;
                       m1=i;
                   }
               }
        }
        cout<<m1<<" "<<m2<<endl;
       }
       
    }
    View Code
  • 相关阅读:
    A. Vasya and Book
    B. Curiosity Has No Limits
    A. Link/Cut Tree
    C. Yuhao and a Parenthesis
    D2. Magic Powder
    B. Approximating a Constant Range
    51nod1185 威佐夫游戏 V2 (模拟乘法)
    博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)
    sg函数模板
    D.Starry的神奇魔法(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12186207.html
Copyright © 2020-2023  润新知