gdutcodeProblem D: 勤奋的涟漪2(新生杯决赛网络同步赛暨全国新生邀请赛)
2016-12-04 21:08
405 查看
Description
涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题Input
第一行一个整数t(t<=100),代表测试数据,第二行一个整数 n(1<=n<=100) 第三行有n个数a1,a2,a3,....an(0<=ai<=3)) ai=0 ,代表第一种情况 ai=1,代表第二种情况 ai=2 ,代表第三种情况 ai=3 ,代表第四种情况Output
输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。Sample Input
471 3 3 2 1 2 3111213Sample Output
0000这个题里面包含的那个高数题结果是-24.然后这个题的思路就是枚举:若出现3,判断下前一个是1或者2,如果是则将3置为2或者1,如果不是不用管,若出现连续的两个1或者2将第二个置为0。
/************************************************************************* > File Name: g8ceshi.cpp > Author: xiaobo > Created Time: 2016年12月04日 星期日 20时19分25秒 ************************************************************************/ #include<iostream> #include<cstdio> using namespace std; const int MAX=105; int n,a[MAX]; int main() { int T; cin>>T; while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l=1; while(a[l]==3) l++; for(int i=l+1;i<=n;i++) { if(a[i]==3){ if(a[i-1]!=3) a[i]=3-a[i-1]; } else { if(a[i]==a[i-1]) a[i]=0; } } int ans=0; for(int i=1;i<=n;i++) { if(!a[i]) ans++; } cout<<ans*(-24)<<endl; } return 0; }
还有一种动态规划的算法
dp[i][j]表示第i天选择做j的最少休息天数(j = 0 ,1 , 2)。
dp[i][0] = min( dp[i-1][0] , min( dp[i-1][1] , dp[i-1][2] ) ) + 1 , 第i天休息,前一天干什么都可以。
如果第i天可以做活动1,那么dp[i][1] = min( dp[i-1][0] , dp[i-1][2] ); 前一天不能做活动1 , 同理转移dp[i][2]
/*************************************************************************
> File Name: g8xiaoceshi.cpp
> Author: xiaobo
> Created Time: 2016年12月04日 星期日 21时55分54秒
************************************************************************/
#include<iostream>
#include<cstring>
using namespace std;
int n;
int dp[105][3];
int num[105];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>num[i];
memset(dp,0x3f,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
for(int i=1;i<=n;i++)
{
dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
if(num[i]==1||num[i]==3)
dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
if(num[i]==2||num[i]==3)
dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
}
cout<<min(dp
[0],min(dp
[1],dp
[2]));
return 0;
}
相关文章推荐
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 几个写出来了的题目
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- Contest1051 - 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛总结
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- codeforces 699C(广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛)
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛
- 2016广东工业大学新生杯决赛:Problem D: 勤奋的涟漪2