bzoj 3704 昊昊的机油之GRST 贪心dp,思维

昊昊的机油之GRST

Time Limit: 10 Sec  Memory Limit: 1024 MB
Submit: 80  Solved: 33
[Submit][Status][Discuss]

Description

昊昊有个好机油,他就是传说中的着力点。现在昊昊获得了一份长度为n的GRST牌(mod 4 意义下),打算作为送给好机油的生日礼物(不是在2月的么)。但是,昊昊深知他的机油是个神犇,作为数字控的他,只会喜欢特定的序列。但是昊昊不怕,他可以使用一次菲亚特(他的机油最喜欢的大招),将一段区间内的数字全部+1,若某个数字为3,则+1后变为0。但昊昊的神力是有限的,问从初始序列a到达最终序列b,最少需要使用多少次菲亚特。

Input

第一行一个正整数n,表示GRST长度。
接下来两行,每行n个值,分别表示ai bi。

Output

仅一个数,即最少需要使用多少次菲亚特。

Sample Input

3
0 2 1
1 0 2

Sample Output

2

HINT

数据规模与约定

样例说明:第一次对区间[1,2] 使用菲亚特。第二次对区间[2,3] 使用菲亚特。N<=10000000   , 0<=ai,bi<=3



http://hzwer.com/3650.html
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 
 7 #define inf 1000000007
 8 #define N 10000007
 9 #define ll long long
10 using namespace std;
11 inline ll read()
12 {
13     ll x=0,f=1;char ch=getchar();
14     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
16     return x*f;
17 }
18 
19 int n,ans,tot;
20 int a[N],b[N],c[N];
21 int d[N],f[N];
22 
23 int main()
24 {
25     n=read();
26     for(int i=1;i<=n;i++)a[i]=read();
27     for(int i=1;i<=n;i++)b[i]=read();
28     for(int i=1;i<=n;i++)
29     {
30         c[i]=b[i]-a[i];
31         if(c[i]<c[i-1])c[i]+=(c[i-1]-c[i])/4*4;
32         if(c[i]<c[i-1])c[i]+=4;
33         f[i]=c[i]/4;
34         d[i]=c[i]-c[i-1];
35     }
36     ans=c[n];f[n+1]=inf;
37     tot=0;
38     for(int i=1;i<=n;i++)
39         if(d[i]==3&&f[i]>tot){d[i]-=4;ans-=3;tot++;}
40     for(int i=1;i<=n;i++)c[i]=c[i-1]+d[i];
41     for(int i=n;i;i--)f[i]=min(c[i]/4,f[i+1]);
42     tot=0;
43     for(int i=1;i<=n;i++)
44         if(d[i]==2&&f[i]>tot){d[i]-=4;ans-=2;tot++;}
45     for(int i=1;i<=n;i++)c[i]=c[i-1]+d[i];
46     for(int i=n;i;i--)f[i]=min(c[i]/4,f[i+1]);
47     tot=0;
48     for(int i=n;i;i--)
49         if(d[i]==1&&f[i]>tot){d[i]-=4;ans--;tot++;}
50     printf("%d",ans);
51 }

 

posted @ 2018-01-15 10:32  Kaiser-  阅读(243)  评论(0编辑  收藏  举报