题目描述:

[来自] (http://acm.nyist.cf/problem/1575)
今天要处决一批犯人,zz国王想要饶恕这些犯人,但作为被人民称为最严执法官的你不同意。为此你和国王争吵不休,最后在大将军LJT的提议下,两人各退一步,由国王设置处决规则。(谁让zz是国王呢)
规则:n名罪犯,一名执法人员只处决一名罪犯,给执法人员和罪犯每人一个编号(1-n),然后zz国王会宣读他的选择(例如一号执法对员处决二号罪犯)然后按照编号从小到大站成两排,对应的执法人员处决对应的罪犯,假设执法队员手里的大刀超级长。如果两名执法队员行刑时会导致长刀碰到一起导致不能砍到罪犯,例如
NYOJ 1575 我想满手鲜血
那1号2号这两罪犯就会被饶恕,而被砍到的罪犯就GG了。而作为执法官的你可以选择t(t<=n)个执法队员执行任务。问最多会有多少罪犯GG。

输入描述:

第一行输入一个Q(Q<=100),表示Q组输入。
每组输入第一行输入包含一个n(1 < n <= 1000)表示有n组犯人和执法人员。
每组包含两个数表示执法人员的编号和犯人的编号。
数据保证:执法人员的编码是1~n且不重复,犯人也是如此

输出描述:

每组输出一个整数表示最多能杀多少犯人。

样例输入:

1
4
2 2
1 3
3 4
4 1

样例输出:

2

提示:

样例一如果执法官选择1号3号4号执行的话
,因为有交叉,所以没人GG.NYOJ 1575 我想满手鲜血
如果选择1号和3号的话2号和4号就都死了(如果选2和3号的话也行也是死2人),同时也是最优的情况死两人所以输出2.

NYOJ 1575 我想满手鲜血

一道LIS最长子序列

本来做这道题的时候以为是贪心结果没想到是LIS最长子序列的变形,思路是先定义一个结构体里面存放执法人员和罪犯,然后用sort 排序将执法人员按照从小到大排序,然后求出排完续后求出罪犯的最长上升子序列就是答案,废话不说看代码


#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;
struct lis
{
    int x,y;
}v[1005];
int s[1005];
int  order(lis a,lis b)
{
    return a.x<b.x;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       int m;
       cin>>m;
       for(int a=0;a<m;a++)
       {
        cin>>v[a].x>>v[a].y;
       }
       sort(v,v+m,order);
       memset(s,0,sizeof(s));

       int most=0;
       s[0]=1;
       for(int i=1;i<m;i++)
       {
           s[i]=1; //如果没有这一步会报错
           for(int j=0;j<i;j++)
           {
               if(v[i].y>v[j].y)
               {
                s[i]=max(s[i],s[j]+1);
               }

           }
       }
       for(int a=0;a<m;a++)
       {
         if(s[a]>most)
         {
             most=s[a];
         }
       }
       cout<<most<<endl;
    }
    return 0;
}

相关文章:

  • 2021-12-17
  • 2021-12-05
  • 2022-12-23
  • 2021-09-29
  • 2022-01-14
  • 2021-07-04
  • 2022-01-04
猜你喜欢
  • 2021-12-17
  • 2022-12-23
  • 2021-06-03
  • 2021-12-15
  • 2022-12-23
  • 2021-10-26
  • 2021-06-03
相关资源
相似解决方案