YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

中文题目,题意好理解。

题解:定义状态DP[i][j]表示第i秒在第j个位置处的最优状态,每一个点只能由相邻点转移,所以转移方程就是dp[i][j]=max({dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]})+arr[i][j],arr[i][j]表示当前状态下的物品的数目。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=2000+7;
int arr1[N];
int arr2[N];
int dp[N]; 
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>arr1[i];
    for(int i=2;i<=n;i++) cin>>arr2[i];
    dp[1]=arr1[1];
    dp[2]=min(arr2[2],arr1[1]+arr1[2]);
    for(int i=3;i<=n;i++) dp[i]=min(dp[i-1]+arr1[i],dp[i-2]+arr2[i]);
    int sec=dp[n]%60;
    dp[n]-=sec;
    int cnt=dp[n]/60;
    int minute=cnt%60;
    cnt-=minute;
    int h=cnt/60;
    h+=8; 
    if(h<10) printf("0%d",h);
    else printf("%d",h);
    printf(":");
    if(minute<10)  printf("0%d",minute);
    else printf("%d",minute);
    printf(":");
    if(sec<10) printf("0%d",sec);
    else printf("%d",sec);
    if(h<12) printf(" am\n");
    else printf(" pm\n");
} 
int main(){
    int t;
    scanf("%d",&t);
    while(t--) solve();
    return 0;
}

 

posted on 2020-05-30 22:41  Target--fly  阅读(138)  评论(0编辑  收藏  举报