B
错误做法:
思路是先将数组里面的数排序,然后比较一对奇数和偶数下标对应的数是否一样,如果一样记一次数,最后比较这个数是否等于n/2,如果是就说明有解,按要求输出,否则输出-1,但出现了段错误。
思路是判断这个数组里有没有两个相同的数有的话,将数赋值给a,b数组,进而通过数组长度是否等于n/2来判断,但运行超时,并且存在输入重复数的问题。
正确做法:
思路与错误做法中发生段错误的思路相似。
#include<bits/stdc++.h>
using namespace std;
int a[201010];
int main()
{
int n;
cin>>n;
for(int i=0;i<2*n;i++) cin>>a[i];
sort(a,a+2*n);
for(int i=1;i<2*n;i+=2)
{
if(a[i]!=a[i-1])
{
cout<<"-1";
return 0;
}
}
for(int j=0;j<2;j++)
{
for(int i=1;i<2*n;i+=2) cout<<a[i]<<" ";
cout<<'\n';
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
const int M=200020;
int main()
{
int n,m;
cin>>n;
m=2*n;
int c[M];
int a[M];
for(int i=0;i<m;i++) cin>>c[i];
sort(c,c+m);
int d=0;
for(int i=0;i<m;i+=2)
{
if(c[i]==c[i+1]) d++;
}
if(d==m/2)
{
for(int i=0;i<m;i+=2)
{
cout<<c[i]<<' ';
}
cout<<endl;
for(int i=0;i<m;i+=2)
{
cout<<c[i]<<' ';
}
}
else cout<<"-1";
return 0;
}
C
当时没看懂题目意思,没有思路,该做法是用双指针来进行判断栏最大距离是否大于k,用l来计算大于k的数量,然后进行比较计算得出最大化成功“关鸡”的概率。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100010];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=0;
int ma=0;
while(r<n)
{
while(a[r]-a[l]>k) l++;
ma=max(ma,r-l+1);
r++;
}
printf("%.8f",1.0*ma/n);
return 0;
}