A. Meximization
#include<bits/stdc++.h>
using namespace std;
int a[105]={0};
int main()
{
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a[x]++;
}
for(int i=0;i<105;i++)
{
if(a[i]!=0)
{
cout<<i<<" ";
a[i]--;
}
}
for(int i=0;i<105;i++)
{
while(a[i]!=0)
{
cout<<i<<" ";
a[i]--;
}
}
cout<<endl;
}
}
B. M-arrays
- 将互余的项放在一起,数量多的比少的最多多一个
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
int visit[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
memset(visit,0,sizeof(visit));
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a[x%m]++;
}
int ans=0;
for(int i=0;i<m;i++)
{
if(a[i]&&!visit[i])
{
if(i%m==0)
{
ans++;
}
else if(!a[m-(i)%m])
{
ans+=a[i];
}
else
{
int mi=min(a[i],a[m-(i)%m]);
int ma=max(a[i],a[m-(i)%m]);
if(mi!=ma)
{
ans+=ma-mi;
}
else
ans++;
}
visit[m-(i)%m]=1;
}
}
cout<<ans<<endl;
}
}
C1. k-LCM (easy version)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
if(n&1)
{
cout<<1<<" "<<(n-1)/2<<" "<<(n-1)/2<<endl;
}
else
{
if(n%4==2)
{
cout<<2<<" "<<(n-2)/2<<" "<<(n-2)/2<<endl;
}
else
{
cout<<n/4<<" "<<n/4<<" "<<n/2<<endl;
}
}
}
}
C2. k-LCM (hard version)
前面的全部取1,就和easy version一样了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
while(k>3)
{
n--;
k--;
cout<<1<<" ";
}
if(n&1)
{
cout<<1<<" "<<(n-1)/2<<" "<<(n-1)/2<<endl;
}
else
{
if(n%4==2)
{
cout<<2<<" "<<(n-2)/2<<" "<<(n-2)/2<<endl;
}
else
{
cout<<n/4<<" "<<n/4<<" "<<n/2<<endl;
}
}
}
}