BestCoder Round #84

本文主要解析了两道ACM竞赛题目,包括一道关于最长递增子序列的问题和一道涉及素数表及质因数分解的题目。通过具体代码展示了算法实现过程,并分享了作者在解决问题过程中的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.贪心

B.b题我昨晚看两个队友都没写出来,早上看觉得挺简单的,天真以为是要以ai结尾的连续的,wa1...然后知道是可以不连续的,做着做着忘了是要以ai结尾的,以为是前面的子序列最长就可以了,wa4...

其实如果了解O(nlogn)的算法就可以很快想出来了,亏我还是写过模板的人,各种wa我也是醉了,每次只要在找到当前数字在LIS数组上的位置就可以了

题目还是挺好的,我发现题目写的太少很容易看错题意呀,怎么破

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 1e5+100;

int a[MAXN],b[MAXN];
int c[MAXN];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        int top=0;
        int mmax = -1;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            int l=0,r=top;
            while(l<r){
                int m = l+(r-l)/2;
                if(b[m]>=a[i]){
                    r = m;
                }else{
                    l = m+1;
                }
            }
            if(l==top){top++;b[l] = a[i];}
            else if(a[i]<b[l]){
                b[l] = a[i];
            }
            //mmax = max(mmax,l+1);
            c[i] = l+1;
        }
        for(int i=0;i<n;i++){
            if(i==0)printf("1");
            else{
                printf(" %d",c[i]);
            }
        }
        cout<<endl;
    }

    return 0;
}
View Code

 D.这道题目素数表的大小其实可以降的 我开了1e6,然后还有坑点没有想到,就是如果某个数是最大因数,那么它的的最小质因数比另个一个因子(当然也是最小因数)大,比如35(5*11),当他作为某个数的最大因子是,另一个因子必然是5以内的素数

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN = 1e6+1000;
ll p[MAXN];
int vis[MAXN];
ll cnt;
ll a[MAXN];

void isprime(){
    cnt = 0;
    for(int i=2;i<MAXN;i++){
        if(!vis[i]){
            p[cnt++] = i;
            for(int j=i*2;j<MAXN;j+=i){
                vis[j] = 1;
            }
        }
    }
}


int main()
{
    isprime();
    //cout<<cnt<<endl;
    //for(ll i=0;i<10;i++)cout<<p[i]<<" ";
   // cout<<endl;
    int T;
    scanf("%d",&T);
    while(T--){
        ll n,d;
        scanf("%lld%lld",&n,&d);
        ll sum = 0;
        for(ll i=0;i<cnt&&p[i]*d<n;i++){
            sum++;
            if(d%p[i]==0){
                break;
            }
        }
        cout<<sum<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/EdsonLin/p/5700792.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值