A题：选择排序直接搞，由于不要求最优交换次数，代码：

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <memory.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 3001;
const int MSIZE = 10000;
const int INF = 1 << 30;
typedef long long ll;
pair<int, int> p[SIZE];

int main() {
int n;
int a[SIZE];
while(cin >> n) {
for(int i = 0; i < n; i ++)
cin >> a[i];
int k = 0;
for(int i = 0; i < n - 1; i ++) {
int Mi = a[i];
int mark = i;
for(int j = i + 1; j < n; j ++) {
if(a[j] < Mi) {
Mi = a[j];
mark = j;
}
}
if(mark != i) {
swap(a[i], a[mark]);
p[k ++] = make_pair(i, mark);
}
}
cout << k << endl;
for(int i = 0; i < k; i ++)
cout << p[i].first << " " << p[i].second << endl;
}
}

B题：贪心思想，排序后从小到大匹配就可以：

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <memory.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 500;
const int MSIZE = 10000;
const int INF = 1 << 30;
typedef long long ll;

int main() {
int n, m;
int a[SIZE], b[SIZE];
while(cin >> n) {
for(int i = 0; i < n; i ++)
cin >> a[i];
cin >> m;
for(int i = 0; i < m; i ++)
cin >> b[i];
sort(a, a + n);
sort(b, b + m);
int sum = 0;
bool vis[SIZE];
Clear(vis, 0);
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
if(!vis[j] && abs(a[i] - b[j]) <= 1) {
vis[j] = 1;
sum ++;
break;
}
}
}
cout << sum << endl;
}
}

C题：贪心思想。假设是最小值，除去第一位尽可能放0。第一位尽可能放1。同理，最大值尽可能放9

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <memory.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 500;
const int MSIZE = 10000;
const int INF = 1 << 30;
typedef long long ll;

string gMi(int m, int s) {
string ans;
int tmp = s - 9 * (m - 1);
if(tmp <= 0) {
ans += '1';
s -= 1;
}
else {
ans += tmp + '0';
s -= tmp;
}
for(int i = 1; i < m; i ++) {
int tmp = s - 9 * (m - i - 1);
if(tmp <= 0) {
ans += '0';
}
else {
ans += tmp + '0';
s -= tmp;
}
}
return ans;
}

string gMx(int m, int s) {
string ans;
for(int i = 0; i < m; i ++) {
if(s >= 9) {
ans += '9';
s -= 9;
}
else {
ans += s + '0';
s = 0;
}
}
return ans;
}

int main() {
int m, s;
while(cin >> m >> s) {
if(s > 9 * m || (m != 1 && s == 0)) {
puts("-1 -1");
continue;
}
if(m == 1 && s == 0) {
puts("0 0");
continue;
}
string Mi = gMi(m, s);
string Mx = gMx(m, s);
cout << Mi << " " << Mx << endl;
}
}

D题：读题花了好久，题目意思就是找菱形（4个点构成）。思路就是dfs2层，对于最后一层假设x点的入度为y。则x点构成的菱形个数为y * (y - 1) / 2

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <memory.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 3030;
const int MSIZE = 10000;
const int INF = 1 << 30;
typedef long long ll;

vector<int> path[SIZE];
ll ans;
int in[SIZE];

void dfs(int x, int root, int flag) {
if(flag == 0) {
if(x != root)
in[x] ++ ;
return ;
}
for(int i = 0; i < path[x].size(); i ++) {
int son = path[x][i];
dfs(son, root, flag - 1);
}
return ;
}

int main() {
int n, m;
int x, y;
while(cin >> n >> m) {
for(int i = 0; i < n; i ++)
path[i].clear();
for(int i = 0; i < m; i ++) {
cin >> x >> y;
x --,y --;
path[x].push_back(y);
}
ans = 0;
for(int i = 0; i < n; i ++) {
Clear(in, 0);
dfs(i, i, 2);
for(int j = 0; j < n; j ++) {
//printf("i:%d, j:%d -> %d\n", i, j, in[j]);
if(in[j] >= 2)
ans += in[j] * (in[j] - 1) / 2;
}
}
cout << ans << endl;
}
}

E题：没读

F题：看了别人的报告。

for i,j:
[i][j] += [i-2][j+2] * C(i,2)
[i][j] += [i-1][j-1+1] * C(i,1)*C(j,1)
[i][j] += [i][j-2] * C(j,2)


#include <iostream>
#include <algorithm>
#include <cstdio>
#include <memory.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 502;
const int MSIZE = 10000;
const int INF = 1 << 30;
typedef long long ll;

ll rec[SIZE][SIZE];
int n, m, mod, x;

ll dp(int nr0, int nr1) {
if(rec[nr0][nr1] != -1)
return rec[nr0][nr1];
if(nr0 == nr1 && nr0 == 0)
return rec[0][0] = 1;

ll ans = 0;
if(nr0 >= 2) {
ll tmp = dp(nr0 - 2, nr1 + 2) % mod;
tmp = tmp * ((nr0 * (nr0 - 1)) / 2 % mod) % mod;
ans = (ans + tmp) % mod;
}
if(nr1 >= 2) {
ll tmp = dp(nr0, nr1 - 2) % mod;
tmp = tmp * ((nr1 * (nr1 - 1)) / 2 % mod) % mod;
ans = (ans + tmp) % mod;
}
if(nr1 >= 1 && nr0 >= 1) {
ll tmp = dp(nr0 - 1, nr1);
tmp = tmp * ((nr0 * nr1) % mod) % mod;
ans = (ans + tmp) % mod;
}
return rec[nr0][nr1] = ans;
}

int main() {
int col[SIZE];
while(cin >> n >> m >> mod) {
Clear(col, 0);
Clear(rec, -1);
for(int i = 0; i < m; i ++)
for(int j = 0; j < n; j ++) {
scanf("%1d", &x);
col[j] += x;
}
int nr0 = 0, nr1 = 0;
for(int j = 0; j < n; j ++) {
if(col[j] == 0) nr0 ++;
else if(col[j] == 1) nr1 ++;
}
cout << dp(nr0, nr1) << endl;
}
}

## Codeforces Round #277.5 解题报告的更多相关文章

1. Codeforces Round 665 赛后解题报告（暂A-D）

Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 $$B$$ 点 坐标为 $$x(x\leq n)$$.由题意我们知道 \[\mid(n-x)- ...

2. Codeforces Round 662 赛后解题报告（A-E2）

Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

3. Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

4. Codeforces Round #299 Div2 解题报告

这场比赛并没有打现场,昨天晚上做了ABCD四道题,今天做掉了E题 以前还没有过切完一场比赛的所有题呢~爽~ A. Tavas and Nafas   Today Tavas got his test ...

5. Codeforces Educational Round 92 赛后解题报告（A-G）

Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

6. Codeforces Round #277 (Div. 2) 题解

Codeforces Round #277 (Div. 2) A. Calculating Function time limit per test 1 second memory limit per ...

7. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

题目传送门 /* 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 */ /************************************************ ...

8. 【codeforces】Codeforces Round #277 (Div. 2) 解读

门户:Codeforces Round #277 (Div. 2) 486A. Calculating Function 裸公式= = #include <cstdio> #include ...

9. Codeforces Round #277 (Div. 2) 解题报告

题目地址:http://codeforces.com/contest/486 A题.Calculating Function 奇偶性判断,简单推导公式. #include<cstdio> ...

## 随机推荐

1. SpringMVC常用配置-处理程序异常以及404错误

2. javascript:void(0)和javascript:;的用法

一.JavaScript:void(0) 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢 ...

3. 用javascript 面向对象制作坦克大战（三）

之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射. 上代码前来张最新的类图: 3. 碰撞检测     前面我们已经完成了坦克的移动和地图的绘制,下面我们开始写碰撞检测. 3. ...

4. Caused by: org.apache.catalina.LifecycleException: A child container failed during start

错误提示: 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache. ...

5. scrapy爬虫学习系列一：scrapy爬虫环境的准备

系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

6. Dubbo原理实现之代理接口的定义

Dubbo有很多的实现采用了代码模式,Dubbo由代理工厂ProxyFactory对象创建代理对象. ProxyFactory接口的定义如下: @SPI("javassist") ...

start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...

8. C++学习笔记(4)----模板实参推断

1. 如图所示代码,模板函数 compare(const T&, const T&) 要求两个参数类型要一样. compare("bye","dad&qu ...

9. React项目的打包