联系我们
简单又实用的WordPress网站制作教学
当前位置:网站首页 > 程序开发学习 > 正文

蓝桥杯打卡Day12

作者:小教学发布时间:2023-09-30分类:程序开发学习浏览:92


导读:文章目录接龙数列冶炼金属一、接龙数列OJ链接本题思路:本题是一道经典的dp问题,设第i个数的首位数字是first,末位数字是last。因为第i个数只可能加...


文章目录

  • 接龙数列
  • 冶炼金属

一、接龙数列OJ链接

本题思路:本题是一道经典的dp问题,设第i个数的首位数字是first, 末位数字是last。因为第i个数只可能加到一个以first结尾的接龙数列中使得这个接龙数列长度加1并且结尾数字变成last.所以状态转移方程为dp[i][last] = max(dp[i - 1][last], dp[i - 1][first] + 1)而显然第一维可以优化掉。

#include <bits/stdc++.h>

constexpr int N=1e5+10;

int n;
int dp[N][10];//表示前i个数以j结尾最小删除的个数

/*
设第i个数的首位数字是first, 末位数字是last。
因为第i个数只可能加到一个以first结尾的接龙数列中
使得这个接龙数列长度加1并且结尾数字变成last.
所以状态转移方程为dp[i][last] = max(dp[i - 1][last], dp[i - 1][first] + 1)
而显然第一维可以优化掉。
*/

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);

  std::cin>>n;
  for(int i=1;i<=n;i++){
    std::string num;
    std::cin>>num;

    int first=num[0]-'0',last=num[num.size()-1]-'0';
    for(int j=0;j<10;j++){
      if(j==last)
        dp[i][j]=std::min(dp[i-1][first],dp[i-1][last]+1);
      else
        dp[i][j]=dp[i-1][j]+1;
    }
  }
  
  int res=INT_MAX;
  for(int i=0;i<10;i++) res=std::min(res,dp[n][i]);
  
  std::cout<<res<<std::endl;
  return 0;
}

二、冶炼金属OJ链接

本题思路:本题是一道数学的题目,设答案为v,因为能炼出b个但炼不出b+1个,所以有b×v≤a且a<(b+1)×v即 ab+1<v⩽ab最小值 ab+1+1, 最大值ab。

#include <bits/stdc++.h>

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);
  
  int n;
  int mi = 0 , mx = 2e9 ; 
  
  std::cin>>n;
  for(int i = 1 ; i <= n ; i ++){
      int a , b ; 
      std::cin >> a >> b ; 
      int r = a/b , l = a/(b+1)+1;
      mi = std::max(mi , l);
      mx = std::min(mx , r) ; 
  }
  
  std::cout << mi << ' ' << mx << std::endl ; 
  return 0;
}





程序开发学习排行
最近发表
网站分类
标签列表