zoukankan      html  css  js  c++  java
  • codeforces 727F Polycarp's problems

    codeforces 727F Polycarp's problems

    题意

    给定大小为750的数组。2e5次询问,每次给出一个值。要求删除数组中尽可能少的数,使得前缀和加上给定的值非负。每次询问输出最少需要删除的数。

    题解

    (f_{i, j})(i)(n)剩下(j)个数时,需要的最小值。
    (f_{i, j}=min(f_{i+1, j}, max(0, f_{i+1, j-1}-a_i)))
    很容易知道,剩下的数越多,需要的最小值越大,因此每次询问在数组(f_1)中进行二分即可。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define rep(i, a, b) for(int i=(a); i<(b); i++)
    #define sz(x) (int)x.size()
    #define de(x) cout<< #x<<" = "<<x<<endl
    #define dd(x) cout<< #x<<" = "<<x<<" "
    typedef long long ll;
    typedef pair<int, int> pii;
    typedef vector<int> vi;
    //------
    
    const int N=777;
    int n,m;
    int a[N];
    ll f[N][N];
    
    int main() {
    	while(~scanf("%d%d",&n,&m)) {
    		///init
    		memset(f,0x3f,sizeof(f));
    		///read
    		rep(i,1,n+1) scanf("%d",a+i);
    		///solve
    		rep(i,1,n+1) f[i][0]=0;
    		f[n][1]=max(0, -a[n]);
    		for(int i=n-1;i;--i) {
    			rep(j,1,n-i+2) {
    				f[i][j]=min(f[i+1][j], max(0ll, f[i+1][j-1]-a[i]));
    			}
    		}
    		while(m--) {
    			ll x;scanf("%lld",&x);
    			int p=upper_bound(f[1], f[1]+n+1,x)-f[1]-1;
    			printf("%d
    ",n-p);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    设计模式学习心得5
    HTTP协议 (六) 状态码详解
    HTTP协议 (五) 代理
    HTTP协议 (四) 缓存
    HTTP协议 (三) 压缩
    HTTP协议 (二) 基本认证
    HTTP协议 (一) HTTP协议详解
    java中abstract和interface的區別(轉)
    基于TCP的字符串传输程序
    文件比较
  • 原文地址:https://www.cnblogs.com/wuyuanyuan/p/8299233.html
Copyright © 2011-2022 走看看