【CQ18高一暑假前挑战赛3】标程

【A:LCM】

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll a,b,g;
    cin>>a>>b;
    g=__gcd(a,b);
    cout<<a/g*b<<endl;
    return 0;
}

【B:STL,用set或者queue+map都行】

#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int maxn=100010;
const ll inf=1e18;
ll a[maxn]; int cnt;
set<ll>s;
void solve()
{
    s.insert(2); s.insert(3); s.insert(5);
    while(!s.empty()){
        ll now=*s.begin();
        a[++cnt]=now; s.erase(s.begin());
        if(now*2<=inf) s.insert(now*2);
        if(now*3<=inf) s.insert(now*3);
        if(now*5<=inf) s.insert(now*5);
    }
}
int main()
{
    solve();
    int T; ll N;
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&N);
        int pos=lower_bound(a+1,a+cnt+1,N)-a;
        printf("%lld
",a[pos]);
    }
    return 0;
}

【C:贪心水题】

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int a[maxn];
int main()
{
    int N,M,i,j,ans=0;
    scanf("%d%d",&N,&M);
    for(i=1;i<=N;i++) scanf("%d",&a[i]);
    sort(a+1,a+N+1);
    j=1;
    for(i=N;i>=j;i--){
        if(i!=j&&a[i]+a[j]<=M) j++;
        ans++;
    }
    printf("%d
",ans);
    return 0;
}

【D:暴力求得每个数的因子,复杂度O(Nsqrrt(N))】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
int num[maxn];
int main()
{
    int N,x,i,j,ans=0;
    scanf("%d",&N);
    for(i=1;i<=N;i++){
        scanf("%d",&x);
        for(j=1;j*j<=x;j++){
            if(x%j==0){
               num[j]++; if(num[j]>1) ans=max(ans,j);
               if(j*j!=x) {
                   num[x/j]++; if(num[x/j]>1) ans=max(ans,x/j);
               }
            }
        }
    }
    printf("%d
",ans);
    return 0;
}

【E:区间DP,和前天那个有点像】

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=510;
ll sum[maxn][maxn];
int ans,x;
int main()
{
    int N,M,i,j,k;
    while(~scanf("%d%d",&M,&N)){
        ans=0;
    for(i=1;i<=N;i++)
      for(j=1;j<=M;j++) 
       scanf("%d",&x),sum[i][j]=sum[i-1][j]+x;
    for(i=1;i<=N;i++)
      for(j=i;j<=N;j++){
         int tmp=0;
         for(k=1;k<=M;k++){
             tmp+=sum[j][k]-sum[i-1][k];
             if(tmp<0) tmp=0;
             if(tmp>ans) ans=tmp;
         }
    }
    printf("%d
",ans);
   }
    return 0;
}

【F:KMP】

请先自学吧。

原文地址:https://www.cnblogs.com/hua-dong/p/9139117.html