首页 > 代码库 > Codeforces Round #277.5 (Div. 2)
Codeforces Round #277.5 (Div. 2)
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",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\n",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;j