2020-5-2

问题 A: 狼

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

在某个游戏中,你接受了一个任务。这个任务要求你消灭n只狼。这些狼排成一排,每只狼都有两个攻击力a和b。如果你消灭一只狼,需要的代价是这只狼的a攻击力加上它旁边的狼的b攻击力。每消灭一头狼,它两边的狼(如果有)会并在一起,仍然保持一排。
你需要求出:消灭所有狼的最小代价。

输入

输入第一行为一个正整数n。
输入第二行为n个非负整数,按顺序表示每只狼的a攻击力;第三行为n个非负整数,表示每只狼的b攻击力。

输出

输出一行一个整数,为最小的代价。 

样例输入 Copy

3 
3 5 7 
8 2 0

样例输出 Copy

17

提示

对于100%的数据,满足1≤n≤400,每只狼的a攻击力和b攻击力均不超过100000。

[提交][状态]

 

考虑分母为0.。。。。。太坑了。

#include
typedef long long ll;
using namespace std;
int main()
{
  ll a,b,c,d;
  cin>>a>>b>>c>>d;
  if(b==0)
  {
      printf("%lld",c);return 0;
  }
  if(d==0)
  {
      printf("%lld",a);return 0;
  }
  ll cnt=0;
  if((a/d)<=(c/b)) cnt=a/d;
  else cnt=c/b;
  a=a-d*cnt;
  c=c-b*cnt;
  if(a<=0) {cout<

 

问题 A: 狼

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

在某个游戏中,你接受了一个任务。这个任务要求你消灭n只狼。这些狼排成一排,每只狼都有两个攻击力a和b。如果你消灭一只狼,需要的代价是这只狼的a攻击力加上它旁边的狼的b攻击力。每消灭一头狼,它两边的狼(如果有)会并在一起,仍然保持一排。
你需要求出:消灭所有狼的最小代价。

输入

输入第一行为一个正整数n。
输入第二行为n个非负整数,按顺序表示每只狼的a攻击力;第三行为n个非负整数,表示每只狼的b攻击力。

输出

输出一行一个整数,为最小的代价。 

样例输入 Copy

3 
3 5 7 
8 2 0

样例输出 Copy

17

提示

对于100%的数据,满足1≤n≤400,每只狼的a攻击力和b攻击力均不超过100000。

#include
typedef unsigned long long ll;
using namespace std;
int a[100005],b[100005],dp[500][500];
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        scanf("%d",a+i);
    for(int i=1; i<=n; i++)
        scanf("%d",b+i);
     for(int i=1;i<=n;i++)
        dp[i][i]=a[i]+b[i-1]+b[i+1];
    for(int i=n-1;i>=1;i--)
    {
        for(int j=i+1;j<=n;j++)
        {
            dp[i][j]=min(dp[i+1][j]+a[i]+b[i-1]+b[j+1],dp[i][j-1]+a[j]+b[i-1]+b[j+1]);
            for(int k=i+1;k<=j-1;k++)
            {
                dp[i][j]=min(dp[i][k-1]+a[k]+b[i-1]+b[j+1]+dp[k+1][j],dp[i][j]);
            }
        }
    }
    printf("%d",dp[1][n]);
    return 0;
}
 
 
/**************************************************************
    Problem: 15408
    User: 2019UPC110
    Language: C++
    Result: 正确
    Time:98 ms
    Memory:3780 kb
****************************************************************/

 

你可能感兴趣的:(题解)