zoukankan      html  css  js  c++  java
  • [HAOI2008]木棍分割

    题解

    第一问应该一眼就可以看出二分+贪心

    问题是第二问。

    可以想到(dp)

    (f[i][j])表示前i个木棍,分成j份, 每一份都不超过ans1的方案数

    (f_{i,j} =sum_{k=x}^{i-1} f_{k,j-1})
    (( 第z位到第i位可以作为一段, x为最小的z ))
    显然(x)满足单调,可以(O(n))求出

    对于上面的dp,前缀和 就可以满足复杂度了

    Code

    #include<bits/stdc++.h>
    
    #define LL long long
    #define RG register
    
    using namespace std;
    
    inline int gi() {
    	RG int x = 0; RG char c = getchar(); bool f = 0;
    	while (c != '-' && (c < '0' || c > '9')) c = getchar();
    	if (c == '-') c = getchar(), f = 1;
    	while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();
    	return f ? -x : x;
    }
    
    const int N = 50010, Mod = 10007;
    
    int n, m, L[N];
    
    bool check(int x) {
    	int cnt = 0, s = 0;
    	for (int i = 1; i <= n; i++) {
    		if (L[i] > x) return 0;
    		if (L[i] + s <= x) s += L[i];
    		else cnt++, s = L[i];
    	}	
    	return cnt <= m;
    }
    
    int f[N], g[N], lf[N];
    
    int main() {
    	//freopen(".in", "r", stdin);
    	//freopen(".out", "w", stdout);
    	n = gi(), m = gi();
    	int l = 0, r = 0;
    	for (int i = 1; i <= n; i++) L[i] = gi(), r += L[i];
    	while (l <= r) {
    		int mid = (l + r) >> 1;
    		if (check(mid)) r = mid-1;
    		else l = mid+1;
    	}
    	int ans1 = r+1, ans2 = 0;
    	int s = 0, w = 0;
    	m++;
    	s = L[1];
    	for (int i = 2; i <= n; i++) {
    		while (s+L[i] > ans1) s -= L[++w];
    		s += L[i];
    		lf[i] = w;
    	}
    	for (int i = 0; i <= n; i++)
    		g[i] = 1;
    	for (int i = 1; i <= m; i++) {
    		for (int j = 1; j <= n; j++)
    			f[j] = (g[j-1]-g[lf[j]-1]+Mod)%Mod;
    		g[0] = 0;
    		for (int j = 1; j <= n; j++)
    			g[j] = (g[j-1]+f[j]) % Mod;
    		ans2 = (f[n]+ans2) % Mod;
    	}
    	printf("%d %d
    ", ans1, ans2);
    	return 0;
    }
    
    
  • 相关阅读:
    全栈程工程师
    月薪8000的程序员和月薪2万的程序员差别在哪里?
    原型中的访问
    关于 基本类型和复合类型 用== 判断的小问题
    使用原型解决构造函数问题
    前端工程师学习路线 --书籍
    程序员成长之路
    GIT学习(1) Pull和Fetch
    OO面向对象编程:第四单元总结及课程总结
    OO面向对象编程:第三单元总结
  • 原文地址:https://www.cnblogs.com/zzy2005/p/10123746.html
Copyright © 2011-2022 走看看