WHU 1552 Seats 枚举
题意:
有一个年级中7个班的n个学生。
一天,他们毫无顺序的站成一排。请计算最小的交换次数,使得 相同班的同学都站在一起。 (只有站在一起的人才能交换)
思路:
如果知道班级的最终排列就能在很短的时间里,计算出所需的交换次数。那么,我们只需要枚举排列即可。
如果,a班的一个人要走到前面,那么,他必须和他前面所有其他班的人交换。
所以,先预处理出一个数组 f[i][j] 表示 每个 i 班的前面的 j 班同学的总和。然后就可以在m(班级数) * m 的时间里求出排列需要交换的次数。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef long long ll; const int MAXN = (int) 1e5+;
const ll INF = (ll)<<; ll f[][], sum[]; //f[i][j] : i 前面有多少个 j
int a[MAXN];
int n;
ll ans;
bool vis[];
int od[]; void cal() {
ll res = ;
for (int i = ; i < ; i++) {
for (int j = ; od[j]!=i; j++) {
res += f[i][od[j]];
}
}
ans = min(ans, res);
} void dfs(int cnt) {
if (==cnt) {
cal();
return ;
}
for (int i = ; i < ; i++) if (!vis[i]) {
vis[i] = true;
od[cnt] = i;
dfs(cnt+);
vis[i] = false;
}
} void print() {
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++)
printf("%d ", f[i][j]);
puts("");
}
} int main() {
#ifdef Phantom01
freopen("WHU1552.in", "r", stdin);
#endif // Phantom01 while (scanf("%d", &n)!=EOF) {
memset(vis, false, sizeof(vis));
memset(f, , sizeof(f));
memset(sum, , sizeof(sum));
for (int i = ; i < n; i++) {
scanf("%d", &a[i]);
sum[a[i]]++;
for (int j = ; j < ; j++) {
f[a[i]][j] += sum[j];
}
}
// print();
ans = INF;
dfs();
printf("%lld\n", ans);
} return ;
}
p.s.:当时比赛的时候有想到过枚举排列,但是不知道该怎么很快的计算交换次数,所以就没写。 收集信息和组合信息的能力还不够啊……
WHU 1552 Seats 枚举的更多相关文章
- HDU 1937 F - Finding Seats 枚举
F - Finding Seats Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- 华中邀请赛现场赛F题 Seats
题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1552 解题报告:题目意思应该很清楚,就是有n个人,分别属于7个班级,然后他们坐成 ...
- hdu1937 Finding Seats
hdu1937 Finding Seats 题意是 求最小的矩形覆盖面积内包含 k 个 空位置 枚举上下边界然后 双端队列 求 最小面积 #include <iostream> #incl ...
- UVA11846-Finding Seats Again(DFS)
Problem UVA11846-Finding Seats Again Accept: 69 Submit: 433Time Limit: 10000 mSec Problem Descrip ...
- [BZOJ 1552] 排序机械臂
Splay大法是坠吼滴! 1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 436 Solved: ...
- whu Problem 1537 - A - Stones I 贪心
题目链接: http://acm.whu.edu.cn/land/problem/detail?problem_id=1537 Stones I Time Limit: 1000MSMemory Li ...
- E. Lost in WHU。矩阵快速幂!
E. Lost in WHU 比赛的时候一直不知道样例怎么来的,然后和队友推了一下,然后还是没什么思路,样例手推很困难,然后我随口枚举了几个算法dp.广搜.快速幂.比赛结束问了谷队长结果真的是用快速幂 ...
- WHU 1537 Stones I
题目见: http://acm.whu.edu.cn/land/problem/detail?problem_id=1537 这个题相当无语,学长给的解法是:枚举取的个数k,然后对每个k贪心,取其中的 ...
- whu 1581 Union of cubes
题目链接: http://acm.whu.edu.cn/land/problem/detail?problem_id=1581 ------------------------------------ ...
随机推荐
- [国家集训队]最长双回文串 (PAM)回文自动机
Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...
- 洛谷 P2633 Count on a tree 主席树
在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数. 对于点 $i$ ,建立 $i$ 到根节点的一棵前缀主席树. 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[l ...
- /www: target is busy. 解决卸载磁盘目录繁忙的问题
umount /www 卸载磁盘遇到 以下问题 umount: /www: target is busy. (In some cases useful info about processes tha ...
- luogu P2664 树上游戏(点分治)
点分治真是一个好东西.可惜我不会 这种要求所有路经的题很可能是点分治. 然后我就不会了.. 既然要用点分治,就想,点分治有哪些优点?它可以\(O(nlogn)\)遍历分治树的所有子树. 那么现在的问题 ...
- 高并发web系统设计
转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...
- SVN学习总结(2)——SVN冲突解决
在我们用VS进行项目合作开发的过程中,SVN的提交控制是至关重要的,大家不可避免的都遇到过SVN冲突的问题,开发的时候,应该认真学习SVN的知识,减少冲突,集中时间放在开发上. 解决冲突有三种方式: ...
- [Angular] Configure an Angular App at Compile Time with the Angular CLI
Compile time configuration options allow you to provide different kind of settings based on the envi ...
- xcode5. 安装cocos2d-x 学习中。。。
找了一些帖子 没搞出来,后来找到原因了 如今的cocos2d版本号在xcode.5上 没右模版了. 用命令行 来运行.看了官方的文档.最终攻克了--- 对于自己解决的问题都会感到点兴奋. .. ...
- Unity Image Effect
1.工作原理 Image Effect是运用于一个Camera,将Camera视见体最终看到的二维图像内容作为一个2DTexture传递给一个Shader, 然后在Shader的Fragment渲染阶 ...
- layer是什么
layer是什么 总结 layer就是一个web弹框 简介 layer是一款web弹层组件,致力于服务各个水平段的开发人员. 可以让你想到即可做到的web弹窗 概述 [1] layer,一个可以让你 ...