题解 | 牛客小白月赛118 CDEF Java题解

红橙

https://ac.nowcoder.com/acm/contest/111666/A

C~F Java题解,代码已去除冗余~~~

C 绿 && F 紫

在这个数据范围下,需要用到矩阵快速幂。。。先求出字符串重复一次的转移矩阵,再将其变成n次方,最后乘初始向量,时间复杂度O(27Tnlogn)

import java.util.*;
public class Main{
    static long mod=(int)1e9+7,mat[][][]={{{2,0,1},{0,1,0},{0,0,1}},{{1,0,0},{1,2,1},{0,0,1}}};
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            long n=sc.nextLong(),matrix[][]={{1,0,0},{0,1,0},{0,0,1}},ans[]=new long[]{0,0,1};
            for(char c:sc.next().toCharArray()){
                matrix=multiply(mat[c-'0'],matrix);
            }
            for(;n!=0;n>>=1,matrix=multiply(matrix,matrix)){
                if(n%2==1){
                    ans=multiply(matrix,ans);
                }
            }
            System.out.println((ans[0]+ans[1])%mod);
        }
    }
    static long[][] multiply(long a[][],long b[][]){
        long ans[][]=new long[3][3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                for(int k=0;k<3;k++){
                    ans[i][j]=(ans[i][j]+a[i][k]*b[k][j])%mod;
                }
            }
        }
        return ans;
    }
    static long[] multiply(long a[][],long b[]){
        long ans[]=new long[3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                ans[i]=(ans[i]+a[i][j]*b[j])%mod;
            }
        }
        return ans;
    }
}

D 青

此题主要参考了官解的思路,首先就是特判k等于1的情况;其他时候,需要固定首尾为错题,二分答案,时间复杂度O(Tnlog(sum(a)))

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            int n=sc.nextInt(),k=sc.nextInt(),a[]=new int[n];
            long sum=0;
            for(int j=0;j<n;j++){
                a[j]=sc.nextInt();
                sum+=a[j];
            }
            if(k==0){
                System.out.println(sum);
            }
            else if(k==1){
                System.out.println(sum-Math.min(a[0],a[n-1]));
            }
            else{
                long l=1,r=sum-a[0]-a[n-1];
                while(l<r){
                    long mid=(l+r)>>1;
                    if(find(a,mid)>=k-2){
                        l=mid;
                    }
                    else{
                        r=mid-1;
                    }
                    if(l==r-1){
                        if(find(a,r)>=k-2){
                            l=r;
                        }
                        break;
                    }
                }
                System.out.println(l);
            }
        }
    }
    static int find(int a[],long min){
        int ans=0;
        long cur=0;
        for(int i=1;i<a.length-1;i++){
            cur+=a[i];
            if(cur>=min&&i<a.length-2){
                ans++;
                cur=0;
                i++;
                if(i==a.length-2){
                    ans--;
                }
            }
            else if(cur<min&&i==a.length-2){
                ans--;
            }
        }
        return ans;
    }
}

E 蓝

对于乘1,是对答案没有贡献的,因此只需考虑不为1的乘数,而这样的操作次数不超过16,不妨将1e5以内的答案都预处理出来,时间复杂度O(ABlogB+T),A==16,B==1e5

import java.util.*;
public class Main{
    static int ans[][]=new int[18][100005];
    static{
        for(int i=0;i<18;i++){
            Arrays.fill(ans[i],(int)1e9);
        }
        ans[0][1]=0;
        for(int j=0;j<17;j++){
            for(int i=1;i<=100000;i++){
                for(int k=1;k*i<=100000;k++){
                    ans[j+1][i*k]=Math.min(ans[j+1][i*k],ans[j][i]+k-1);
                }
            }
        }
    }
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            System.out.println(ans[Math.min(17,sc.nextInt())][sc.nextInt()]);
        }
    }
}
全部评论

相关推荐

03-24 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危,&nbsp;“前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失&nbsp;→&nbsp;汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失&nbsp;→&nbsp;纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放&nbsp;App&nbsp;Store,&quot;移动端开发者&quot;这个职业压根不存在。八年后,全球应用经济规模突破&nbsp;1000亿美元,凭空诞生了数百万开发者岗位。每一次&quot;这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
钱嘛数字而已:拖拉机被发明出来之后,就不需要农民了吗?农民还是需要的,但不需要这么多了,另外对农民的要求也变高了,需要会开拖拉机。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务