http://acm.hdu.edu.cn/showproblem.php?pid=1260
居然自己写出来又一遍过了,开心
经验:找规律,主要是开始列前四个的组成情况,就发现:
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
就很赞很开心很开心
因为我好久都习惯错几个小时了,别人却那么厉害,都不敢碰ACM了,现在调整状态,看到自己还是可以的,很开心很开心,在现在特殊的心情下。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define N 2003
using namespace std;
int a[N],b[N],dp[N];//单人,双人(用前者序号)记录,dp
void trans(int t)//把秒换为时间输出
{
int h,m,s;
s=t%60;
t/=60;
m=t%60;
t/=60;
h=8+t;
if(h<12){
printf("%02d:%02d:%02d am\n",h,m,s);
}else{
printf("%02d:%02d:%02d am\n",h-1,m,s);
}
}
int main()
{
//FILE*fp=fopen("text.in","r");//------记得最后注释掉!!
int n;
scanf("%d",&n);
//fscanf(fp,"%d",&n);
while(n--){
int t=0;
int k;
scanf("%d",&k);
//fscanf(fp,"%d",&k);
for(int i=1;i<=k;i++){
//fscanf(fp,"%d",&a[i]);
scanf("%d",&a[i]);
}
for(int i=1;i<k;i++){
//fscanf(fp,"%d",&b[i]);
scanf("%d",&b[i]);
}
dp[0]=0;
dp[1]=a[1];
for(int i=2;i<=k;i++){
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
}
trans(dp[k]);
}
return 0;
}
复习代码:
5/18
#include<bits/stdc++.h>
#ifdef LOCAL
FILE*FP=freopen("text.in","r",stdin);
#endif
#define _forplus(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[2005],b[2005],s[2005];
void print(int sum){
int h,m,s,flag=0;//am
s=sum%60;
sum/=60;
m=sum%60;
sum/=60;
h=8+sum;
if(h>=12)flag=1;
if(h>12)h-=12;
printf("%02d:%02d:%02d %s\n",h,m,s,(flag?"pm":"am"));
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
_forplus(i,1,n){
scanf("%d",&a[i]);
}
_forplus(i,1,n-1){
scanf("%d",&b[i]);
}
s[0]=0;
s[1]=a[1];
_forplus(i,2,n){
s[i]=min(a[i]+s[i-1],b[i-1]+s[i-2]);
}
print(s[n]);
}
return 0;
}