codeforces 1076F

题解:dp转移只考虑最后一个以多少个相同的数结尾就好了。如何保证以最少的数结尾需要贪心

#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
const int MX = 1e6+7;
const int INF = 0x3f3f3f3f;
int t[MX],f[MX];
int n,k;
int get_val(int lastt, int lastf, int t, int f)
{
    if(lastt == 0){
        if(t > f){
            if(t/(f+1) + (t%(f+1) > 0) > k) return INF;
            if(k*f + 1 >= t) return 1;
            return t - k*f;
        }
        else{
            int tf = f+lastf;
            if(tf/t + (tf%t > 0) > k) return INF;
            return 1;
        }
    }
    else {
        if(t > f){
            int tt = t+lastt;
            if(tt/(f+1) + (tt%(f+1) > 0) > k) return INF;
            if(k*f + 1 >= tt) return 1;
            return tt - k*f;
        }
        else{
            if(f/t + (f%t) > k) return INF;
            return 1;
        }
    }
}

bool work()
{
    int lastt = 0, lastf = 0;
    lastt = get_val(0,0,t[1],f[1]);
    lastf = get_val(0,0,f[1],t[1]);
    int nowt = INF, nowf = INF;
    if(lastt == INF && lastf == INF) return 0;
    for(int i = 2; i<= n; i++){
        if(lastt < INF) {
            nowt = min(nowt,get_val(lastt,0,t[i],f[i]));
            nowf = min(nowf,get_val(0,lastt,f[i],t[i]));
        }
        if(lastf < INF){
            nowt = min(nowt,get_val(0,lastf,t[i],f[i]));
            nowf = min(nowf,get_val(lastf,0,f[i],t[i]));
        }
        lastt = nowt; lastf = nowf;
        nowt = nowf = INF;
        if(lastt == INF && lastf == INF) return 0;
    }
    return 1;
}
int main(){
#ifdef LOCAL
    freopen("input.txt","r",stdin);
#endif // LOCAL
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= n; i++)
        scanf("%d",&t[i]);
    for(int i = 1; i <= n; i++)
        scanf("%d",&f[i]);
    if(work()) printf("YES\n");
    else printf("NO\n");
}

猜你喜欢

转载自blog.csdn.net/qq_18869763/article/details/84199815