• BZOJ2298: [HAOI2011]problem a


    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2298

    题解:刚开始思考的方向错了。。。一直在想LIS什么的,又发现不合法的情况不好判断,真是个伤心的故事。。。

              把问题转化一下,第i个人说有n-ai-bi个人和它分数一样高,那么我们就可以抽象出一条线段【a+1,n-b】,它的权值为n个人中说这句话的次数和 n-ai-bi的最小值。

             然后我们就将问题转化成了:给若干条线段,每条线段有一定的权值,选出若干条互不相交的线段,使得权值和最大。

             感觉是贪心 or DP。思考一下用DP就好了。

    代码:

     1 #include<cstdio>
     2 
     3 #include<cstdlib>
     4 
     5 #include<cmath>
     6 
     7 #include<cstring>
     8 
     9 #include<algorithm>
    10 
    11 #include<iostream>
    12 
    13 #include<vector>
    14 
    15 #include<map>
    16 
    17 #include<set>
    18 
    19 #include<queue>
    20 
    21 #include<string>
    22 
    23 #define inf 1000000000
    24 
    25 #define maxn 200000+5
    26 
    27 #define maxm 200000+5
    28 
    29 #define eps 1e-10
    30 
    31 #define ll long long
    32 
    33 #define pa make_pair
    34 
    35 #define for0(i,n) for(int i=0;i<=(n);i++)
    36 
    37 #define for1(i,n) for(int i=1;i<=(n);i++)
    38 
    39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    40 
    41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    42 
    43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
    44 
    45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    46 
    47 #define mod 1000000007
    48 
    49 using namespace std;
    50 
    51 inline int read()
    52 
    53 {
    54 
    55     int x=0,f=1;char ch=getchar();
    56 
    57     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    58 
    59     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    60 
    61     return x*f;
    62 
    63 }
    64 int n,f[maxn];
    65 vector<int>a[maxn];
    66 map<pair<int,int>,int>mp;
    67 
    68 int main()
    69 
    70 {
    71 
    72     freopen("input.txt","r",stdin);
    73 
    74     freopen("output.txt","w",stdout);
    75 
    76     n=read();
    77     for1(i,n)
    78     {
    79         int x=read(),y=read();
    80         x++;y=n-y;
    81         if(x>y)continue;
    82         mp[pa(x,y)]++;
    83         if(mp[pa(x,y)]==1)a[y].push_back(x);
    84     }
    85     for1(i,n)
    86     {
    87         f[i]=f[i-1];
    88         for(int j=0,k=a[i].size();j<k;j++)
    89          f[i]=max(f[i],f[a[i][j]-1]+min(mp[pa(a[i][j],i)],i-a[i][j]+1));
    90     }
    91     cout<<n-f[n]<<endl;
    92 
    93     return 0;
    94 
    95 }  
    View Code
  • 相关阅读:
    Webpack 入门指迷--转载(题叶)
    浏览器工作原理理解
    Knockout.js初体验
    node.js链接mysql
    2020年度春季学习总结--第二周
    Python 爬取 热词并进行分类数据分析-[安全性改造]
    以 CheatEngine 为例的六个质量属性
    2020年度春季学习总结--第一周
    软件架构师如何工作-个人见解
    Steam 游戏 《Crashlands(崩溃大陆)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标12)
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4254864.html
Copyright © 2020-2023  润新知