排序,求出相邻元素的差,如果有大于一的就不行。
#include <bits/stdc++.h>
using namespace std;
int a[100],b[100];
int main()
{
int t,n;
cin>>t;
while(t--)
{
int cnt=0,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<n;i++)
b[++cnt]=abs(a[i+1]-a[i]);
for(int i=1;i<=cnt;i++)
if(b[i]>1)
sum++;
if(sum==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
随便搞一搞
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100],b[100];
int c[100],d[100],q[100];
int main()
{
int t,n;
cin>>t;
while(t--)
{
int e=0,s=0;
ll sum=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],c[i]=a[i];
for(int i=1;i<=n;i++)
cin>>b[i],d[i]=b[i];
sort(c+1,c+n+1);
sort(d+1,d+n+1);
e=c[1];
s=d[1];
//cout<<e<<" "<<s<<endl;
for(int i=1;i<=n;i++)
{
int g=a[i]-e;
int h=b[i]-s;
sum+=max(g,h);
}
cout<<sum<<endl;
}
}
二分查找
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int w[100];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>w[i];
}
sort(w+1,w+1+n);
int ans=0;
for(int k=2;k<=n<<1;k++){
int l=1,r=n,cur=0;
while(l<r){
if(w[l]+w[r]==k){
cur++;
l++;
r--;
}else
if(w[l]+w[r]<k){
l++;
}else{
r--;
}
}
ans=max(ans,cur);
}
cout<<ans<<endl;
}
return 0;
}
定义两个栈pos0和pos1,分别存储以0结尾的子串的编号和以1结尾的子串的编号。
遇到1从queue0中取,遇到0从queue1中取。
如果不为空的话,则将pos1栈顶元素赋给a[i],将读到的0成功接到了已有的结尾为1的任意一个子串中,加入0之后这个子串变成了以0结尾的子串,将该子串编号压入到pos0中,然后再将pos1栈顶元素弹出。
如果为空的话,表示当前读到的元素没办法接到任何一个子串后头,所以该元素就成为了一个新的子串起点。因此子串总个数ans+1,然后将ans+1压入到pos0中。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,ans;
int a[200001];
stack<int> pos0;
stack<int> pos1;
string s;
cin>>t;
while (t--){
memset(a,0,sizeof(a));
while (!pos0.empty())
pos0.pop();
while (!pos1.empty())
pos1.pop();
cin>>n;
cin>>s;
ans=0;
for (int i=0; i<n; i++){
if(s[i]=='0'){
if (pos1.empty()){
pos0.push(++ans);
a[i]=ans;
}
else{
a[i]=pos1.top();
pos0.push(a[i]);
pos1.pop();
}
}
else {
if (pos0.empty()){
pos1.push(++ans);
a[i]=ans;
}
else{
a[i]=pos0.top();
pos1.push(a[i]);
pos0.pop();
}
}
}
cout<<ans<<endl;
for (int i=0; i<n; i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}