传送门:http://codeforces.com/contest/1156
B:
先桶排,只要从1开始往后隔一个取一个到最后之后,从0开始跳一个取一个,但是1,2,3得情况特判
#include<bits/stdc++.h>
using namespace std;
int num[40];
int main()
{
int t;
cin>>t;
while(t--)
{
vector<int>v;
v.clear();
memset(num,0,sizeof(num));
char C[105];
cin>>C+1;
int len=strlen(C+1);
for(int i=1;i<=len;i++){
num[C[i]-'a']++;
}
for(int i=0;i<26;i++){
if(num[i])v.push_back(i);
}
int sz=v.size();
if(sz==1){
cout<<C+1<<endl;continue;
}
if(sz==2){
if(v[0]==v[1]-1){
cout<<"No answer"<<endl;
}
else cout<<C+1<<endl;
continue;
}
if(v.size()==3){
if(v[0]==v[1]-1&&v[1]==v[2]-1){
cout<<"No answer"<<endl;
continue;
}
else if(v[0]==v[1]-1){
while(num[v[0]]){
cout<<(char)(v[0]+'a');
num[v[0]]--;
}
while(num[v[2]]){
cout<<(char)(v[2]+'a');
num[v[2]]--;
}
while(num[v[1]]){
cout<<(char)(v[1]+'a');
num[v[1]]--;
}
cout<<endl;continue;
}
else {
while(num[v[1]]--){
cout<<(char)(v[1]+'a');
}
while(num[v[0]]--){
cout<<(char)(v[0]+'a');
}
while(num[v[2]]--){
cout<<(char)(v[2]+'a');
}
cout<<endl;
}
continue;
}
else{
for(int i=1;i<v.size();i+=2){
while(num[v[i]]){
cout<<(char)(v[i]+'a');
num[v[i]]--;
}
}
for(int i=0;i<v.size();i+=2){
while(num[v[i]]){
cout<<(char)(v[i]+'a');
num[v[i]]--;
}
}
cout<<endl;
}
}
}
C:
对于这种配对问题要思考最多分成两半,然后再贪心的分配,最大得最好分配给最早满足条件得。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e5+5;
int C[MAXN];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>C[i];
}
sort(C+1,C+1+n);
int cnt=n,ans=0;;
for(int i=n/2;i>=1;i--){
if(C[cnt]-C[i]>=m){
ans++;
cnt--;
}
}
cout<<ans<<endl;
}