zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12186207.html
Copyright © 2011-2022 走看看