牛客算法入门课练习赛2 A dp C dp

链接:https://ac.nowcoder.com/acm/contest/5968/A
来源:牛客网

题目描述
牛市,一个拥有悠久历史的城市,2333年考古学家在牛市发现了一个神秘的遗迹,这些勇敢而智慧的古队员准备进入这个遗迹,但要进入这个遗迹就需要通过一段天梯。而登上天梯必须要按照它要求的方法,否则就无法登上。它要求的方法为:

1.可以直接登上比当前位置高1个单位高度的天梯。

2.可以从当前阶梯往下退一级天梯(第一级天梯除外)。

3.在连续退k步后,跳跃一次,跳跃的高度不超过2^k。比如说你现在位于第i级天梯,且之前从第i+k级天梯退下来,此时你可以跳到高度不超过(当前高度+ 2^k)的任何一级天梯。每一次跳跃只算一次移动哦!

开始的时候考古小队在第一级天梯。请你计算出最少的移动步数以登上最高一级天梯。

为何考古搞得跟游戏历险一样?牛市一定是一个魔性的城市!

输入描述:
第1行:一个整数N,表示天梯级数。

第2行:N个整数,依次为每层天梯梯的高度,保证递增。

输出描述:
一个整数,如果能登上天梯,输出最小步数,否则输出-1。

示例1
输入
复制
5
0 1 2 3 6
输出
复制
7
说明
1≤N≤200。 每级阶梯高度不超过2^31-1

#include 
using namespace std;
typedef long long ll;
ll dp[500];
int a[500];
int qpow(int x, int n)
{
   int sum = 1;
   while (n)
   {
      if (n & 1)
      {
         sum *= x;
      }
      x *= x;
      n >>= 1;
   }
   return sum;
}
int main()
{
   ios::sync_with_stdio(0);
   cin.tie(0);

   memset(dp, 0x3f, sizeof dp);
   int n;
   cin >> n;
   for (int i = 1; i <= n; i++)
      cin >> a[i];
   dp[1] = 0;
   for (int i = 2; i <= n; i++)
   {
      bool f = 1;
      if (a[i] == a[i - 1] + 1)
      {
         dp[i] = dp[i - 1] + 1;
         f = 0;
      }
      for (int j = 1; j < i; j++)
      {
         for (int r = j; r >= 1; r--)
         {
            if (a[i] <= a[r] + qpow(2, j - r))
            {
               dp[i] = min(dp[i], dp[j] + j - r + 1);
               f = 0;
               break;
            }
         }
      }
      if (f)
      {
         cout << -1 << endl;
         return 0;
      }
   }
   cout << dp[n] << endl;
   return 0;
}

链接:https://ac.nowcoder.com/acm/contest/5968/C
来源:牛客网

题目描述
牛市的幸存的先民在流星雨之后就忍痛离开了这片土地,选择迁徙,在迁徙的途中,他们需要渡过一条河。因为牛市的树木在流星雨中被严重破坏,所以他们只造出了一艘小船,船太小了,一次只能乘坐两人。
牛市的先民们每个人划船的速度都不尽相同,所以每个人都有一个渡河时间T,为了保证船的平衡,当穿上有两个人的时候,需要他们按照慢的那个人的速度划船,也就是说船到达对岸的时间等于船上渡河时间长的那个人的时间。
现在已知N个人的渡河时间T,请问最少要花费多少时间,才能使所有人都过河。
输入描述:
输入文件第一行为先民的人数N(N\leq 100000)(N≤100000),以下有N行,每行一个整数为每个人的渡河时间。
输出描述:
输出文件仅包含一个数,表示所有人都渡过河的最少渡河时间。
示例1
输入
复制
4
5
7
11
16
输出
复制
42
说明
首先1,2先到河对岸花费7,然后1回来花费5,3,4到河对岸花费16,2回来花费7,1,2再到河对岸花费7

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn], n;
int ans;
int dp[maxn];
int main()
{
   cin >> n;
   for (int i = 1; i <= n; i++)
   {
      cin >> a[i];
   }
   sort(a, a + n);
   memset(dp, 0x3f, sizeof(dp));
   dp[1] = a[1];
   dp[2] = a[2];
   for (int i = 3; i <= n; i++)
   {
      dp[i] = min(dp[i - 1] + a[1] + a[i], dp[i - 2] + a[2] + a[i] + a[1] + a[2]);
   }
   cout << dp[n] << endl;
}

你可能感兴趣的:(牛客)