zoukankan      html  css  js  c++  java
  • [HAOI2011]problem a

    题意

    Here

    思考

    感觉这题思路挺不错的

    考虑单独的一个人的 (a_i,b_i),那么就是有 (n - a_i - b_i) 个人分数相同,而这个分数相同的区间是 ([a_i+1,n-b_i]),要满足合理性,我们应该选出若干个不相交的区间,使得权值最大(这个权值也就是区间范围相同的人数),这个问题就很好解决了。(代码中 (f[i]) 表示前 (i) 个人最多的说真话人数)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 100010;
    int n, a[N], b[N], f[N];
    vector<int> sum[N];
    map<pair<int, int>, int> mp;
    int main(){
        cin >> n;
        for(int i=1; i<=n; i++){
            cin >> a[i] >> b[i];
            int l = a[i] + 1, r = n - b[i]; if(l > r) continue;
            if(++ mp[ make_pair(l, r) ] == 1) sum[r].push_back(l);
        }
        for(int i=1; i<=n; i++){
            f[i] = f[i - 1];
            for(int j=0; j<sum[i].size(); j++){
                int l = sum[i][j];
                f[i] = max(f[i], f[l - 1] + min(mp[make_pair(l, i)], i - l + 1) );
            }
        }
        cout << n - f[n];
        return 0;
    }
    

    总结

    注意对于问题的转换

  • 相关阅读:
    判断是否是微信浏览器
    弹性盒模型
    一个发光的搜索边框(纯CSS3)
    小练习
    js控制div是否显示
    遮罩弹窗
    布局
    CSS构造表单
    CSS 滤镜(IE浏览器专属其他浏览器不支持)
    Css中光标,DHTML,缩放的使用
  • 原文地址:https://www.cnblogs.com/alecli/p/10085268.html
Copyright © 2011-2022 走看看