蓝桥杯刷题冲刺 | 倒计时11天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦

文章目录

  • 1.质因子
  • 2.蓝桥王国

1.质因子

  • 题目

    链接: 1545. 质因子 - AcWing题库

    给定一个整数 N,找出它的所有质因子,并按如下格式输出:

    N= p 1 k 1 ∗ p 2 k 2 ∗ . . . ∗ p m k m p1^{k1}*p2^{k2}*...*pm^{km} p1k1p2k2...pmkm

    注意: 如果 N=1 则输出 1=1

    输入格式

    一个整数 N。

    输出格式

    输出时,按 N=p1^k1*p2^k2*...*pm^km 的格式输出答案。

    其中 pi 是质因子,应按照递增顺序排列,ki 是 pi 的指数,如果 ki 为 1,则不必输出。

    数据范围

    1≤N≤ 2 31 2^{31} 231−1

    输入样例:

    97532468
    

    输出样例:

    97532468=2^2*11*17*101*1291
    
  • 第一次 AC 90%

    #include
    using namespace std;
    
    typedef long long ll;
    
    void f(int n)
    {
        for(int i=2;i<=n/i;i++)
        {
            int s=0;
            while(n%i==0)
            {
                n/=i;
                s++;
            }
            
            if(s==0)
                continue;
            
            if(s==1) 
                cout<<i<<'*';
            else
                cout<<i<<'^'<<s<<'*';
                
           
        }
         if(n>1)
            cout<<n;
    }
    
    
    int main()
    {
        ll n;
        cin>>n;
        
        cout<<n<<"=";
        
        if(n==1)
            cout<<n<<endl;
        else
            f(n);
        
        return 0;
    }
    

    第一次的符号输出有问题

  • 题解

    #include
    using namespace std;
    
    int main()
    {
        long long n;
        cin>>n;
        
        if(n==1)  //特判
        {
            cout<<"1=1";
            return 0;
        }
        
        cout<<n<<"=";
        
        bool first_use =1;  //解决符号问题
        
        for(long long i=2;i<=n/i;i++)  //分解质因子的模板
        {  
            if(n%i==0)  //注意这里需要判断,再s=0
            {
                int s=0;
                while(n%i==0)
                {
                    n/=i;
                    s++;
                }
                
                if(first_use) first_use=0;  //符号这里要注意
                else cout<<'*';
               
                cout<<i;
                
                if(s>1) cout<<'^'<<s;
            }
        }
        
        if(n>1)
            if(first_use)
                cout<<n;
            else cout<<'*'<<n;
        
        return 0;
    }
    
  • 反思

    1. 数据范围复习

      unsigned int 0~4294967295 (10位数,4e9)
      int -2147483648~2147483647 (10位数,2e9 2 31 2^{31} 231-1)
      long long -9223372036854775808~9223372036854775807 (19位数, 9e18 ) 2 63 2^{63} 263-1
      unsigned long long 0~18446744073709551615 (20位数,1e19) 2 64 2^{64} 264 - 1

      其实,这个题我试了试 不用 long long 也能 AC

      但是 考试的时候 还是 long long 吧,万一越界了呢 ,我胆小

    2. 这个题输出带有运算符号

      第一次,我都整晕了,没有想起来有 flag 来标记第一个+* 带在每一质因子的前面,一直想的是*带在后面,想了好久,最后一个怎么不带 这个符号 T-T

      • 输出技巧:使用 flag 标记第一个数,符号带在数的前面(说的有点抽象,结合上面这个题理解)
      • 使用 多个 if else 来判断条件,是否输出相对应的符号

2.蓝桥王国

  • 题目

    链接: 蓝桥王国 - 蓝桥云课 (lanqiao.cn)

    小明是蓝桥王国的王子,今天是他登基之日。

    在即将成为国王之前,老国王给他出了道题,他想要考验小明是否有能力管理国家。

    题目的内容如下:

    蓝桥王国一共有 N 个建筑和 M 条单向道路,每条道路都连接着两个建筑,每个建筑都有自己编号,分别为 1∼N 。(其中皇宫的编号为 1)

    国王想让小明回答从皇宫到每个建筑的最短路径是多少,但紧张的小明此时已经无法思考,请你编写程序帮助小明回答国王的考核。

    输入描述

    输入第一行包含三个正整数N,M

    第 2 到 M+1 行每行包含三个正整数 u,v,w,表示 uv 之间存在一条距离为 w 的路。

    1≤N≤3× 1 0 5 10^5 105,1≤m 1 0 6 10^6 1061≤ui, vi≤N,0≤wi≤ 1 0 9 10^9 109

    输出描述

    输出仅一行,共 N 个数,分别表示从皇宫到编号为 1∼N 建筑的最短距离,两两之间用空格隔开。(如果无法到达则输出 −1)

    输入输出样例

    示例 1

    输入

    3 3 
    1 2 1
    1 3 5
    2 3 2
    

    输出

    0 1 3
    
  • 第一次 AC 0%

    #include
    using namespace std;
    
    const int N=3*1e2+10,M=1e6+10;
    
    int n,m;
    bool st[N];
    int g[N][N];
    int dist[N];
    
    void dijkstra()
    {
    	memset(dist,0x3f,sizeof dist);
    	
    	dist[1]=0;
    	
    	for(int i=1;i<=n;i++)
    	{
    		int t=-1;
    		for(int j=1;i<=n;j++)
    			if(!st[j]&&(t==-1||dist[t]>dist[j]))
    				t=j;
    				
    		st[t]=true;
    		
    		for(int j=1;j<=n;j++)
    		{
    			dist[j]=min(dist[j],dist[t]+g[t][j]);	
    		}
    	}	
    	
    }
    
    int main()
    {	
    	scanf("%d%d",&n,&m);
    	
    	memset(g,0x3f,sizeof g);
    	
    	while(m--)
    	{
    		int a,b,w;
    		scanf("%d%d%d",&a,&b,&w);
    		g[a][b]=min(g[a][b],w);
    	}
    	
    	dijkstra();
    	
    	for(int i=1;i<=n;i++)
    		if(dist[i]==0x3f3f3f3f)	cout<<-1;
    		else cout<<dist[i]<<' ';
    	
    	return 0;
    }
    

    没输出

  • 第二次 AC 50%

    #include
    using namespace std;
    
    typedef pair<int,int> PII;
    
    const int N=3*1e5+10;
    
    int n,m;
    int h[N],e[N],w[N],ne[N],idx;
    bool st[N];
    int dist[N];
    
    void add(int a,int b,int c)
    {
    	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
    }
    
    void dijkstra()
    {
    	memset(dist,0x3f,sizeof dist);
    	dist[1]=0;
    	
    	priority_queue<PII,vector<PII>,greater<PII>> heap;
    	heap.push({0,1});
    	
    	while(heap.size())
    	{
    		auto t=heap.top();
    		heap.pop();
    		
    		int vis=t.second,distance=t.first;
    		
    		if(st[vis])
    			continue;
    		
    		st[vis]=1;
    		
    		for(int i=h[vis];i!=-1;i=ne[i])
    		{
    			int j=e[i];
    			
    			if(dist[j]>distance+w[i])
    			{
    				dist[j]=distance+w[i];
    				heap.push({dist[j],j});
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	
    	memset(h,-1,sizeof h);
    	
    	while(m--)
    	{
    		int a,b,c;
    		scanf("%d%d%d",&a,&b,&c);
    		add(a,b,c);
    	}
    	
    	dijkstra();
    	
    	for(int i=1;i<=n;i++)
    		if(dist[i]==0x3f3f3f3f) cout<<-1<<' ';
    		else cout<<dist[i]<<' ';
    	
    	return 0;
     } 
    
  • 第三次 AC 100%

    #include
    using namespace std;
    
    typedef long long ll;
    
    typedef pair<long long,int> PII;
    
    const int N=5*1e5+10;
    
    ll n,m;
    ll h[N],e[N],w[N],ne[N],idx;
    bool st[N];
    ll dist[N];
    
    void add(ll a,ll b,ll c)
    {
    	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
    }
    
    void dijkstra()
    {
    	memset(dist,0x3f,sizeof dist);
    	dist[1]=0;
    	
    	priority_queue<PII,vector<PII>,greater<PII>> heap;
    	heap.push({0,1});
    	
    	while(heap.size())
    	{
    		auto t=heap.top();
    		heap.pop();
    		
    		ll vis=t.second;
    		long long distance=t.first;
    		
    		if(st[vis])
    			continue;
    		
    		st[vis]=1;
    		
    		for(ll i=h[vis];i!=-1;i=ne[i])
    		{
    			ll j=e[i];
    			
    			if(dist[j]>distance+w[i])
    			{
    				dist[j]=distance+w[i];
    				heap.push({dist[j],j});
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%lld%lld",&n,&m);
    	
    	memset(h,-1,sizeof h);
    	
    	while(m--)
    	{
    		ll a,b,c;
    		scanf("%lld%lld%lld",&a,&b,&c);
    		add(a,b,c);
    	}
    	
    	dijkstra();
    	
        for(ll i=1;i<=n;i++)
            if(dist[i]>=0x3f3f3f3f3f3f3f3f) cout<<-1<<' ';   //long long 需要 8个3f
        else cout<<dist[i]<<" ";
    	
    	return 0;
     } 
    
  • 反思

    1. 第一次直接用错模板了

      朴素版的模板用于稠密图(矩阵存),堆优化版用于稀疏图(邻接表存)

      m是 1 0 5 10^5 105 级别的话就是稠密图,m是n级别的就是稀疏图

    ps数组元素个数不能太多,一开始用的 1e5 ,编译过不去

Alt

你可能感兴趣的:(蓝桥杯倒计时冲刺,蓝桥杯,c++,职场和发展)