计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析

新手,欢迎交流,持续更新。

A. 结果填空:有趣的数字

原题链接:传送门

思路:

  1. 先把素数筛选出来,然后一个一个判断是不是含有5 。
  2. 答案是3282 。

    代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        boolean vis[]=new boolean[100001];
        int prime[]=new int[100001];
        vis[1]=vis[0]=true;
        int index=0;
        for(int i=2;i<=100000;i++)
        	if(!vis[i]) {
        		prime[index++]=i;
        		for(int j=i*2;j<=100000;j+=i)
        			vis[j]=true;
        	}
        int ans=0;
        for(int i=0;i<index;i++)
        {
        	while(prime[i]>0) {
        		int x=prime[i]%10;
        		prime[i]/=10;
        		if(x==5) {
        			ans++;
        			break;
        		}
        	}
        }
        System.out.println(ans);
    }
}


B. 结果填空:爬楼梯

原题链接:传送门

思路:

  1. 简单的dp,不会的可以推荐做硬币分配问题 。
  2. 答案是72 。

    代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        int dp[]=new int[11];
        dp[0]=1;
        for(int i=1;i<=10;i++)
        {
        	for(int j=1;j<=4;j++)
        		if(j<=i) {
        			dp[5]=dp[7]=0;
        			dp[i]+=dp[i-j];
        		}
        }
        for(int i=1;i<=10;i++)
        	System.out.println(dp[i]);
    }
}



C. 结果填空:七巧板

原题链接:传送门

思路:

  1. 跟平面划分一个道理,每次都会多划分一个区域,F(n)=F(n-1)+1 。
  2. 答案是47 。 = 7+ (6+7+8+9+10)
  3. 模拟题那个答案是42,但正确答案是47 。

    代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        int x=7,a=5;
        for(int i=1;i<=5;i++)
        	x+=a++;
        System.out.println(x);
    }
}


F. 程序设计:寻找重复项

原题链接:传送门

思路:

  1. 下午没用long,题意也理解错,越界情况是下标超过2e6,我写成x超过2e6,只过了40%。
  2. 结束后发现脑瘫行为改了之后只过90%。
  3. 再改了一次,代码注释处,粗心,没有初始化完整,AC 100%。

    代码如下:
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        long a=cin.nextLong(),b=cin.nextLong(),c=cin.nextLong();
        long x=1;
        HashMap<Long,Long>mp = new HashMap<Long,Long>();
        mp.put(x,(long) 1);  //忘记把1塞进去了 无奈....一直卡在%90
        for(int i=1;i<=2000000;i++) {
        	x=(x*a+x%b)%c;
        	mp.put(x, mp.get(x)==null?1:mp.get(x)+1);
        	if(mp.get(x)>1) {
        		System.out.println(i);
        		return ;
        	}
        }
        System.out.println("-1");
    }
}


H. 程序设计:字符串

原题链接:传送门

思路:

  1. 注意看题意,先判断原串是不是mod的倍数。
  2. 再判断能不能交换一次实现 整个串的数值是mod的倍数。
  3. 实在不行再输出-1 -1 。
  4. 下午做题没注意,直接按第二种情况处理,结果没AC,结束后改了一些A过。

    代码如下:
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    static  int a[] =new int[2005];
	static  int mod;
    
	public static int gets(String s) {
		int ans=0;
		int n=s.length();
		for(int i=0;i<n;i++) {
			ans=ans*26+s.charAt(i)-'A';
			ans%=mod;
		}
		return ans;
	}
	
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        String s=cin.next();
        mod=cin.nextInt();
        int n=s.length();
       // System.out.println(n);
        int ans=gets(s);
        if(ans==0) {
        	System.out.println("0 0");
        	return ;
        }
        a[n-1]=1;
        for(int i=n-2;i>=0;i--) {
        	a[i]=26*a[i+1]%mod;
        	//System.out.println(a[i]);
        }
        for(int i=0;i<n;i++)
        	for(int j=i+1;j<n;j++)
        	{
        		int res=(s.charAt(i)-s.charAt(j))*a[j]+
        				(s.charAt(j)-s.charAt(i))*a[i];
        		if( (res+ans+mod)%mod==0) {
        			System.out.println(++i +" "+ ++j);
        			return ;
        		}
        	}
        System.out.println("-1 -1");
    }
}



I. 程序设计:最短路

原题链接:传送门

思路:

  1. 下午只建了一张图,过了%40 。
  2. 正反向建图跑一遍,目前过50% 。

    代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    static class Edge{
        int v,w,next;
        Edge(int v,int w,int next){
            this.v=v;
            this.w=w;
            this.next=next;
        }
    }
    static int manx=1000000+5;
    static int mamx=manx;
    static int head[][]=new int[2][manx];
    static long d[][]=new long[2][manx];
    static boolean vis[]=new boolean[manx];
    static Edge a[][] = new Edge[2][mamx];
    static int cnt[] = new int[manx];
    static int n,m,s,k0=0,k1=0;
    static void add(int i,int u,int v, int w)
    {
    	int k;
    	if(i==0) k=k0;
    	else k=k1;
    	Edge x=new Edge(v,w,head[i][u]);
    	a[i][++k]=x;
    	head[i][u]=k;
    	if(i==0) k0=k;
    	else k1=k;
    }
    
    static void dij(int x){
    	for(int i=1;i<=n;i++) {
    		d[x][i]=(long) 1e9;
    		vis[i]=false;
    	}
        Deque<Integer> q=new ArrayDeque<Integer>();
        q.add(s);
        d[x][s]=0;
        vis[s]=true;
        while(!q.isEmpty()){
            int u=q.poll();
            vis[u]=false;
            for(int i=head[x][u];i>0;i=a[x][i].next){
                int v=a[x][i].v;
                int w=a[x][i].w;
                if(d[x][v]>d[x][u]+w){
                    d[x][v]=d[x][u]+w;
                    if(!vis[v]) {
                    	vis[v]=true;
                    	if(!q.isEmpty()&&d[x][v]>=d[x][q.peek()]) q.addLast(v);
                    	else q.addFirst(v);
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        while(t-->0) {
        	n=cin.nextInt();
            m=cin.nextInt();
            k0=0;
            k1=0;
            s=1;
            for(int i=1;i<=n;i++) {
            	head[0][i]=0;
            	head[1][i]=0;
            }
            while(m-->0){
                int u=cin.nextInt();
                int v=cin.nextInt();
                int w=cin.nextInt();
                add(0,u,v,w);
                add(1,v,u,w);
            }
            dij(0);
            dij(1);
            long ans=0;
            for(int i=2;i<=n;i++)
            	ans+=d[1][i]+d[0][i];
            System.out.println(ans);
        }
    }
}


发布了50 篇原创文章 · 获赞 15 · 访问量 4229

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/104032351