您的位置:首页 > 理论基础 > 计算机网络

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 3111213

Sample 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐