zoukankan      html  css  js  c++  java
  • NOI 2009 诗人小G

    推荐阅读

    这道题调的我天昏地暗

    dp就是太难调

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    const int N = 100005;
    
    long double Pow(long double a, int b) {
    	long double res = 1, base = a;
    	while (b) {
    		if (b & 1) res = res * base;
    		base = base * base;
    		b >>= 1;
    	}
    	return res;
    }
    
    class Solution {
    	int n, l, p;
    	int w[N], q[N], c[N];
    	long double f[N];
    	long double Calc(int j, int i) {
    		return f[j] + Pow(abs(w[i] - w[j] - l), p);
    	}
    	int TwoDivide(int c1, int c2) {
    		int l = c1, r = n + 1, mid;
    		while (l <= r) {
    			mid = l + r >> 1;
    			if (Calc(c1, mid) >= Calc(c2, mid)) r = mid - 1;
    			else l = mid + 1;
    		}
    		return l;
    	}
    public:
    	Solution() { }
    	void Solve(int _, int __, int ___) {
    		n = _, l = __ + 1, p = ___;
    		std:: string str; 
    		for (int i = 1; i <= n; i += 1)
    			std:: cin >> str, w[i] = w[i - 1] + str.size() + 1;
    		int h = 1, t = 1;
    		for (int i = 1; i <= n; i += 1) {
    			while (h < t and c[h] <= i) h += 1;
    			f[i] = Calc(q[h], i);
    			while (h < t and c[t - 1] >= TwoDivide(q[t], i)) t -= 1;
    			c[t] = TwoDivide(q[t], i), q[++t] = i;
    		}
    		if (f[n] > 1e18) printf("Too hard to arrange
    ");
    		else printf("%.0Lf
    ", f[n]);
    		puts("--------------------");
    	}
    };
    
    int main () {
    	int T;
    	scanf("%d", &T);
    	for (int i = 0; i < T; i += 1) {
    		int n, l, p;
    		scanf("%d%d%d", &n, &l, &p);
    		Solution* Sol = new Solution();
    		Sol->Solve(n, l, p);
    		delete Sol;
    	}
    	return 0;
    }
    
  • 相关阅读:
    关于数据集的划分--训练集、验证集和测试集
    关于过拟合的问题总结
    paddle 09-13
    关于NLP多分类任务评价指标的总结
    数组题解
    多进程-协程
    多任务-进程
    多任务-线程
    网络-tcp
    网络-udp
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/9774074.html
Copyright © 2011-2022 走看看