第一题是给你2,3,5三个数字,问你用这三个数字组成的数字按照大小排序,第n个是多少。(2,3,5,22,23,25,32,33,35,52,53,55,222,223........)
思路:1位数是3个,2位数是9个,k位数是3^k个,用n一路减下去,看看第n个是几位数,如第10个的话,10>3,所以大于一位数,10-3=7,7<=9,所以是两位数,两位数里的第7个,这题就转换成3进制中第7个数字是什么了(两位数),由于进制是0-base,所以7-1=6,一个个位算下去,6%3=0,所以第一位选择第0个的2,然后6/3=2,算第2位,2%3=2,所以选择第2个数5,最后结果是52~
代码不贴了~
第二题是很简单的dp问题,问你一个类型下面的图,一个球从上往下滚,每滚到一个数字就加上它,滚到最底层的时候,最大的数是多少?(只能向下或向左下右下滚)
3
2 5 7
9 6 2 7 4
6 7 4 7 9 5 10
首先把这个图装换一下变成
3
2 5 7
9 6 2 7 4
6 7 4 7 9 5 10
然后每个球只能往下,右下,右右下滚,就好做了~
dp一波就行了~
代码如下:
代码语言:javascript复制#include <iostream>
#include<stdio.h>
#include<string>
#include <vector>
#include <algorithm>
#include <stack>
#include <set>
#include <map>
#include<string.h>
using namespace std;
int dp[1000];
int a[1000];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i )
{
for (int j = 0; j < 2 * i - 1; j )scanf("%d", &a[j]);
for (int j = 2 * i - 2; j >=0; j--)
{
if (j >= 2 && dp[j - 2] > dp[j])dp[j] = dp[j - 2];
if (j >= 1 && dp[j - 1] > dp[j])dp[j] = dp[j - 1];
dp[j] = a[j];
}
}
int ans = dp[0];
for (int j = 0; j < 2 * n - 1; j )ans = ans > dp[j] ? ans : dp[j];
printf("%dn", ans);
}