A
题意:给定n个数,最多交换n次获得一个不减的序列,求一个合法的交换序列。
题解:每次找从i开始的最小值换到第i个位置就可以了。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int a[5000],n,max1,maxx;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
printf("%d
",n);
for (int i=1;i<=n;++i)
{
max1=2e9;maxx=0;max1=-max1;
for(int j=1;j<=n-i+1;++j) if (a[j]>max1)
{
max1=a[j];maxx=j;
}
swap(a[maxx],a[n-i+1]);
printf("%d %d
",maxx-1,n-i);
}
return 0;
}
B
题意:N个男孩M个女孩参加舞会,每个人有一个能力值,两个跳舞的人必须为一男一女且能力值差在1之内,求最多有多少对。
题解:直接求个匹配就可以了。。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstring>
int num,b[200],a[20000],next[20000],a1[200],a2[200],ans,vis[200],n,m,link[200];
using namespace std;
int dfs(int x)
{
for (int i=b[x];i;i=next[i])
{
int y=a[i];
if (!vis[y])
{
vis[y]=1;
if (link[y]==0||dfs(link[y]))
{
link[y]=x;
return 1;
}
}
}
return 0;
}
void addedge(int x,int y)
{
++num;a[num]=y;next[num]=b[x];b[x]=num;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a1[i]);
scanf("%d",&m);
for (int j=1;