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相邻的两个数。

#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

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/12186207.html