题目:
碎碎念:
气死我了气死我了,这题预判过了结果重判wa了,本来没准备写题解的。最后一小时看C没做出来的我像个小丑
要求:
看看能不能将长度为n的数组分成k块排序后符合从小到大。
分析:
分成k个序列,说明要切k-1下。
把它的初始位置记录下来,按数值大小从小到大排序,从头遍历,如果两个数不挨着,就说明是这里是切来的,记录这个值。最后必须要切的次数小于k就好了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct point
{
int v,pp;
} b[100000+7];
bool cmp(point x1,point x2)
{
return x1.v<x2.v;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int k=0;
int x;
for(int i=0; i<n; i++)
{
cin>>x;
b[i].v=x;
b[i].pp=i;//存初始位置
}
//cout<<"k:"<<k<<endl;
if(m==n)//此时肯定yes,单个数成序列
{
cout<<"Yes"<<endl;
continue;
}
sort(b,b+n,cmp);
for(int i=0; i<n-1; i++)
{
if(b[i].pp+1!=b[i+1].pp)
{
k++;
}
}
if(k<m)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
想想还是很难过,原来预判过了还会wa啊