文章目录
- 接龙数列
- 冶炼金属
一、接龙数列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);elsedp[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;
}