题目来源
CSP2022-J-T4
题解1,预计得分10分
数据分析,测试点1-2的n≤10,k=0。可采用傻傻的暴力得分
先取点后排序再判断是否符合题意
取点方法有两种:dfs和二进制,见链接
时间复杂度为指数级
#include<bits/stdc++.h>
using namespace std;
int n, k, ans=1;
struct node{
int x, y;
};
node p[510], t[510];//p用于输入,t用于存放取出的点
bool cmp(node a, node b){
return a.x+a.y < b.x+b.y;
}
bool pd(int len){
bool f=true;
for(int i=1; i<len; i++)
if(t[i].x+t[i].y-t[i-1].x-t[i-1].y != 1){
f=false;break;
}
return f;
}
bool cni(int x, int y){//x个数取y个数,此处也可用dfs暴力选取
bool f=false;
for(int i=(1<<y)-1; i<(1<<x); i++){
int num=0; int k=i;//num用于计数k的二进制位1的个数
while(k){
k=k&(k-1);
num++;
}
if(num==y){
int cnt=0;
memset(t, 0, sizeof(t));
for(int j=0; j<x; j++)
if(i&(1<<j))
t[cnt++]=p[j];
sort(t, t+cnt, cmp);
// for(int w=0; w<cnt; w++)
// cout<<t[w].x<<","<<t[w].y<<" ";
// cout<<endl;
if(pd(cnt))
return true;
}
}
return f;
}
int main()
{
cin>>n>>k;
for(int i=0; i<n; i++)cin>>p[i].x>>p[i].y;
for(int i=n; i>1; i--)
if(cni(n, i))//从n个数中取出i个点
{
ans=i;
break;
}
cout<<ans;
return 0;
}
/*
5 4
5 4
1 2
3 3
1 3
2 3
*/
标签:node,10,int,bool,ans,510,上升,点列
From: https://www.cnblogs.com/tflsnoi/p/16939347.html