题目链接:http://codeforces.com/problemset/problem/140/B

题目意思:给出 Alexander 和他的 n 个朋友的 preference lists:数字 1~n 的排列。现在Alexander 需要遵循两条rules向他的 朋友发送贺卡。

1、他不会send 和 该朋友给他的一模一样的贺卡。

2、对于当前他所拥有的贺卡,他只会选择他自己最喜欢的卡给朋友。

同一张卡可以使用多次,而且尽量使得他的朋友满意,也就是尽量满足该朋友的 preference lists。

现在需要找出一条 send card 的 schedule,表示某个 moment 下应该send card 到某个friend中。

正如题解所说,这条题目难就难在模拟上。因为Alexander 某个时刻的决策受到两个因素的影响:他自己本人的preference list  以及他朋友的preference list 的影响。而且 Alexander 的preference list 随着时间的推移是有所改变的。所以我们希望在尽量不使得他朋友的preference list 太差的情况下,按照题目所说的,运用那两条rule.

排除 send 同 receive 是同 一 张卡并不困难,因为 编号为 i 的人send card 的时刻正是 i ,也就是编号为 i 的卡!不等于 i 即可。然后就是考虑对该朋友应该send 哪张卡了:对朋友的preference list 的每个数都check 下 Alexander 的preference list 中哪个数可以派发。(说不下去了,以下是请教乌冬子后整理的)

引用如下(白话文,请见谅),思路代码都非常清晰!

/*****************************

对于每个朋友,都枚举出所有alex可能发出既卡片,然后从中选出呢个朋友比较中意既就得

其实喜爱列表作用就系话比我地知,有滴卡系永远唔会寄出去

我地用朋友既角度去捻,最好既结果就系拿到alex可能寄出卡里面,自己最喜爱果张

注意到alex可以系任何时刻发卡片,所以枚举可能寄出卡片方法就系求出alex每日会寄出既卡片就得,因为有rule2所以我地要针对每个人求,例如,第一个例子,对于朋友1,alex每日寄出既卡系0,2,3,3,3,对于朋友2,每日寄出既卡片系1,1,3,3,3,朋友3系1,1,3,3,3 如此类推

********************************/

他的代码,就是按这个思路写的,我改了下下标,省去了一些处理,命名也改了下。

 #include <cstdlib>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std; const int N = 3e2 + ; int n, fri_pref[N][N]; int main()
{
cin.sync_with_stdio();
while (cin >> n) {
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) {
cin >> fri_pref[i][j];
} int Alex_pref[N];
for (int i = ; i <= n; i++) {
int input;
cin >> input;
Alex_pref[input] = i; // 标出Alex表的喜好编号顺序
} int res[N];
for (int i = ; i <= n; i++) //
{
bool h[N] = {false};
int now = -;
for (int j = ; j <= n; j++) // Alex 表
{
if (j == i || (~now && Alex_pref[j] > Alex_pref[now])) // ~now 即 now != -1,枚举Alex每日对i这个人寄出的卡片,且排除了Alex一定派不出去的卡
continue;
now = j;
h[now] = true;
} for (int j = ; j <= n; j++)
{
if (!h[fri_pref[i][j]])
continue;
res[i] = fri_pref[i][j];
break;
}
} for (int i = ; i < n; i++)
cout << res[i] << " ";
cout << res[n] << endl;
} return ;
}

codeforces 140B.New Year Cards 解题报告的更多相关文章

  1. Codeforces Educational Round 92 赛后解题报告(A-G)

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

  2. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  3. Codeforces Round #382 (Div. 2) 解题报告

    CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...

  4. codeforces 471C.MUH and House of Cards 解题报告

    题目链接:http://codeforces.com/problemset/problem/471/C 题目意思:有 n 张卡,问能做成多少种不同楼层(floor)的 house,注意这 n 张卡都要 ...

  5. codeforces 507B. Amr and Pins 解题报告

    题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.( ...

  6. codeforces 500B.New Year Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 ...

  7. codeforces B. Xenia and Ringroad 解题报告

    题目链接:http://codeforces.com/problemset/problem/339/B 题目理解不难,这句是解题的关键 In order to complete the i-th ta ...

  8. codeforces 462C Appleman and Toastman 解题报告

    题目链接:http://codeforces.com/problemset/problem/461/A 题目意思:给出一群由 n 个数组成的集合你,依次循环执行两种操作: (1)每次Toastman得 ...

  9. codeforces 460A Vasya and Socks 解题报告

    题目链接:http://codeforces.com/problemset/problem/460/A 题目意思:有一个人有 n 对袜子,每天早上会穿一对,然后当天的晚上就会扔掉,不过他会在 m 的倍 ...

随机推荐

  1. (入门SpringBoot)SpringBoot配置全局异常(五)

    Spring的全局异常,用于捕获程序员没有捕获的异常.具体请看下面代码: 1.ControllerAdvice拦截异常,统一处理.通过Spring的AOP来管理. @ControllerAdvicep ...

  2. jdk8之永久区Permanent区参数设置分析

    jdk8之永久区Permanent区参数设置分析 学习了:https://blog.csdn.net/wuhenzhangxing/article/details/78224905 jdk7中可以进行 ...

  3. Flash中如何使用滤镜

    使用滤镜 应用或删除滤镜 复制和粘贴滤镜 为对象应用预设滤镜 启用或禁用应用于对象的滤镜 启用或禁用应用于对象的所有滤镜 创建预设滤镜库 对象每添加一个新的滤镜,在属性检查器中,就会将其添加到该对象所 ...

  4. java.lang.String中的trim()方法的详细说明(转)

    String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗? 一直以为Trim()方法就是把字符串两端的空格字符给删去,其实我错了,而且错的比较离谱. 首先我直接反编译String ...

  5. Android加壳native实现

    本例仅在Android2.3模拟器跑通过,假设要适配其它机型.请自行研究,这里不过抛砖引玉. 0x00 在Android中的Apk的加固(加壳)原理解析和实现,一文中脱壳代码都写在了java层非常ea ...

  6. Spring集成JDBC

    不同spring版本合成的方式,有时候不一样,需要查看帮助文档来看如何集成,帮助文档在spring发行包中. 1.导入spring的包(这里吧Spring-3.1.3 Release的所有jar包都导 ...

  7. vs升级c++项目遇到的一些问题

    1.error C1189: #error :  This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x ...

  8. Eoeclient源代码分析---SlidingMenu的使用

    Eoeclient源代码分析及代码凝视 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,能够通过ViewPager和PagerIndicator显示相应的数据内容. 0  BaseSlid ...

  9. Android - Activity定制横屏(landscape)显示

    Activity定制横屏(landscape)显示 本文地址: http://blog.csdn.net/caroline_wendy Android横屏(landscape)显示:  android ...

  10. EasyUI基础入门之Droppable(可投掷)

    怎么说呢Droppable这个单词究竟是什么意思,准确来说easyui作者究竟要表达什么意思,还是不大好拿捏的.只是没关系,没有必要纠结与这些细枝末节的东西,依据官网的demo效果,就简单的将之定义为 ...