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
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 }