又熬夜刷了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. linux和unix的对照

    在之前的博客中说到,linux是一个单一内核的操作系统,但它与传统的单一内核UNIX操作系统不同. 在普通单一内核系统中,全部内核代码都是被静态编译和链接的. 而在linux中,能够动态的装入和卸载内 ...

  2. 深入理解Android(5)——从MediaScanner分析Android中的JNI

    前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...

  3. OPENCV(3) —— 对XML和YAML文件实现I/O 操作

    XML\YAML文件在OpenCV中的数据结构为FileStorage string filename = "I.xml"; FileStorage fs(filename, Fi ...

  4. SQL语句查询数据库所有表和所有字段的详细信息(包括表描述和字段描述)

    select (case then ddd.value else '' end ) as "表名(中文)" --如果表名相同就返回空 , (case then d.name els ...

  5. Important Abstractions and Data Structures

    For Developers‎ > ‎Coding Style‎ > ‎ Important Abstractions and Data Structures 目录 1 TaskRunne ...

  6. chown---改变某个文件或目录的所有者和所属的组

    chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用户或者是用户D,用户组可以是组名或组id.文件名可以使由空格 ...

  7. 【2017 Multi-University Training Contest - Team 1 1011】KazaQ's Socks

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6043 [Description] 一个人壁橱里有n双袜子,每天早上取一双最小下标的袜子,然后晚上放 ...

  8. leetCode 27.Remove Element (删除元素) 解题思路和方法

    Remove Element Given an array and a value, remove all instances of that value in place and return th ...

  9. onvif开发总结

    ONVIF开发经验总结 ONVIF开发经验总结............................................................................. ...

  10. Android ijkplayer在windows下编译并导入Android Studio

     我是看着里面的步骤来做的,由于我自己对Linux环境和命令不熟悉,导致我对Cygwin的知识为零,在编译ijkplayer的时候走了一点弯路,需要的同学先去看一下上面的这篇文章,我这边是对上面文章做 ...