cf549B Looksery Party 贪心
题目大意:有n个员工,每个员工通讯录里有自己的号码和其他一些员工的号码。现在有若干员工参加一个聚会,他们会给自己通讯录里所有的人发一条短信,包括自己。现在有个人预测了每个员工会收到多少条短信,而你要寻找一种员工参与聚会的情况,也就是决定哪些员工参与聚会,能够使对所有员工的预测都错误。n<=100
也就是有一个n*n的01矩阵,其中对角线一定是1,要选定一些行,使得这些选定的行每一列的和不等于给定的一个预测值。
这个是大一六月份做的,看了下代码简单到可怕,当然也就理所当然的WA了。
想了一会发现其实没有很好的思路,看了一下tourist大佬的代码,简直精美。。。。
感叹自己还是太菜了啊
这是一个思路很精妙的贪心,主要切入点在于每个人的通讯录里一定有自己,所以只要我们安排,每个人都能收到短信,即可以防止任何人的预测值为0的情况。
那么我们首先找是否有人预测值是0,也就是是否有列的预测值是0。如果有,那么我们就把该行选来聚会,此时这个人自己肯定会收到自己给自己的短信,即收到的短信数大于0了。此时最重要的一点是,我选择了这个人他自己来解决他自己的问题后,无论后续再选多少人,有多少人会给他发短信,他的预测值都不可能是正确的了。
既然选了他去聚会,他就要给通讯录里所有人都发短信,所以可以将他通讯录里所有人的预测值减1,得到剩余预测值,即在除这行以外,我要选择的剩余行,其每列的和不能等于剩余预测值。
这样就可以不断解决剩余预测值为0的人,方法就是把他选去聚会。一旦一个人被选取聚会,也就意味着他以后再也不会预测值出问题了。因此n轮内一定能使所有剩余预测值都不为0。
问题就解决了。
所以贪心的证明点在于,一旦有人预测值为0,我可以通过立即将他选掉来解决,并且他以后预测值都不会为0了。这样n轮每轮解决一个,必定能解决所有n个人的预测值问题。
#include <bits/stdc++.h>
using namespace std;
#define PB push_back
#define MP make_pair
typedef long long ll;
const int mod = 1e9 + ;
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int maxn = ; char s[maxn][maxn];
int cnt[maxn];
int ans[maxn],c = ;
int n; int main(){
scanf("%d",&n);
for(int i = ; i <= n ; ++ i)scanf("%s",s[i]+);
for(int i = ; i <= n ; ++ i)scanf("%d",&cnt[i]);
for(int t = ; t <= n ; ++ t){
for(int i = ; i <= n ; ++ i){
if(cnt[i])continue;
ans[++c] = i;
for(int j = ; j <= n ; ++ j){
if(s[i][j] != '')cnt[j] -- ;
}
}
}
sort(ans + , ans + c +);
printf("%d\n",c);
for(int i = ; i <= c ; ++ i)printf("%d ",ans[i]);
printf("\n");
return ;
}
cf549B Looksery Party 贪心的更多相关文章
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【BZOJ-4245】OR-XOR 按位贪心
4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 486 Solved: 266[Submit][Sta ...
- code vs 1098 均分纸牌(贪心)
1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有 N 堆纸牌 ...
- 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心
SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...
- 【贪心】HDU 1257
HDU 1257 最少拦截系统 题意:中文题不解释. 思路:网上有说贪心有说DP,想法就是开一个数组存每个拦截系统当前最高能拦截的导弹高度.输入每个导弹高度的时候就开始处理,遍历每一个拦截系统,一旦最 ...
随机推荐
- 【js高程学习笔记】关于变量值和函数参数
变量包含了两种不同类型的值: 基本类型 (Undefined.null.Boolean.Number.string都属于基本类型) 引用类型 (对象) 两种值在赋值上不同的是: 将一个引用类型的值(对 ...
- 活代码LINQ——08
一.模块代码 ' Fig. 9.6: ListCollection.vb ' Generic List collection demonstration. Module ListCollection ...
- python 常用网站
https://www.tutorialgateway.org/python-tutorial/
- numpy数组及处理:效率对比
def Sum(n): #定义一个函数(注意:格式对齐,否则会出错) a=list(range(n)) b=list(range(0,50000*n,5)) c=[] for i in range(l ...
- L1-060 心理阴影面积
这是一幅心理阴影面积图.我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线).由红.蓝线围出的面积,就是我们在做作业时的心理阴影面积. 现给出 ...
- 运行python脚本时,报错InsecurePlatformWarning: A true SSLContext object is not available,解决方法
今天,要在新环境里运行一个python脚本,遇到下面的报错: /usr/lib/python2.7/site-packages/urllib3/util/ssl_.py:160: InsecurePl ...
- Ubuntu下安装git
1 安装 官网上提供的命令是: $ sudo add-apt-repository ppa:git-core/ppa 中间暂停时,按回车键Enter继续安装. $ sudo apt-get updat ...
- WPF 系统关闭模式
WPF App.xaml中ShutdownMode的属性值 OnLastWindowClose(默认值) 最后一个窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭. ...
- Linux:Gentoo系统的安装笔记(二)
这期笔记继续安装Gentoo,上期我们已经到了可以进入新环境了,这意味着就是将原来的安装CD或其它介质改为硬盘上安装系统了,话不多说,马上开始! 恢复安装 由于我已经中断了安装,对于已经可以进入新环境 ...
- 关于windows映射网络驱动器,登录时重新连接
如果想登录系统后映射盘符还在,但是不自动连接,则参考下面方法.方法其实很简单,关键的步骤是:登录共享的时候,登录界面取消选中“保存凭据”,然后映射的时候,选择“下次开机是重新连接” 这样,下次开机的时 ...