zoukankan      html  css  js  c++  java
  • codevs 1198 国王的游戏

    题意:

    有个国王站在一个队列的开头,左右手各有一个数字,然后有n个人左右手也各有一个数字,然后把这n个人随便排序,定义第i个人的权值为前面所有的人左手数字乘积除以第i个人右手的数字,问的是怎么排序使得这n个人中最大的权值最小,输出这个权值。

    题解:

    问题是怎么排序使得最大权值最小,那我们就需要知道排序的条件,为了找出这个条件,我们考虑第i个人和第i+1个人。

    解:设a,b为第i个人左右手的数字,c,d为第i+1个人左右手的数字,s为第1个人到第i-1个人左手数字的乘积

    可以得出第i个人的权值为wi = s / b 第i+1个人的权值为 wi+1 = s * a / d,那么最大值为max (s / b, s * a / d)

    可以得出换了位置之后第i+1个人的权值为 wi+1 = s / d 第i个人的权值为 wi = s * c / b,那么最大值为max (s / d, s * c / b)

    假设换了位置更优 那么 max (s / d, s * c / b) < max (s / b, s * a / d)

    假设s / d > s * c / b 那么 s / d < max (s / b, s * a / d),很显然的是s * a / d > s / d,那么根据s / b > s / d 可以得出d > b 但与条件(b > c * d)矛盾不成立

    假设s / d < s * c / b 那么 s * c / b < max(s / b, s * a / d) 但是 s * c / b > s / b所以不考虑,那么由 s * c / b < s * a / d 得出 a * b < c * d 符合条件 b < c * d

    得出结论:按照左右手乘积从小到大排序一定最优

    因为我很懒就没有写高精度了QAQ

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int N = 1e3 + 7;
    #define ll unsigned long long
    int n;
    ll sl, sr;
    struct node {ll L, R;} p[N];
    
    bool cmp (node a, node b) {
    	return a.L * a. R < b.L * b.R;
    }
    
    int main () {
    	scanf ("%d", &n);
    	cin >> sl >> sr;
    	for (int i = 1; i <= n ;++i) {
    		cin >> p[i].L >> p[i].R;
    	}
    	sort (p + 1, p + 1 + n, cmp);
    	ll sum = sl, maxi = 0;
    	for (int i = 1; i <= n; ++i) {
    		maxi = max (maxi, sum / p[i].R);
    		sum = sum * p[i].L;
    	}
    	cout << maxi << endl;
    	return 0;
    }
    

      

    总结:

    这种按照某种方式变化的题型,需要我们找到变化的最优条件,不妨设一设,搞一搞总会搞出来的~

  • 相关阅读:
    SqlServer事务语法及使用方法
    mysql解决自动断开8小时未曾用过的链接
    JIRA license申请和语言包下载
    String literal is not properly closed by
    android开发 NDK 动态链接多个第三方库(so)
    vim字符串替换
    VMware tools的用途及安装[跨系统文件拖拽]
    十大高明的Google搜索技巧
    安装ADT-20.0.3的时候产生org.eclipse.cdt.feature.group 0.0.0' but it could not be ..
    [Android NDK]修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 问题
  • 原文地址:https://www.cnblogs.com/xgtao/p/5985245.html
Copyright © 2011-2022 走看看