又熬夜刷了cf,今天比正常多一题。比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过……应该也没人Hack。写写解题报告吧= =。

解题报告例如以下:

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题:看了别人的报告。

思路就是:记录每列1的个数。令nr0代表有多少列含有0个1,nr1代表有多少列含1个1。由于和位置无关。递推方程式:

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)

最后输出f[0][0],代表所有填充完成

由于递推方程式不太好在循环中实现,就改为记忆化搜索,代码例如以下:

#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") ...

  7. 并发基础(六) 线程Thread类的start()和run()

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

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

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

  9. React项目的打包

    1.create-react-app 来自Facebook官方的零配置命令行工具.create-react-app是来自于Facebook出品的零配置命令行工具,能够帮你自动创建基于Webpack+E ...

  10. SQL注入工具实践

    程序简介 超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入. ...