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,想法就是开一个数组存每个拦截系统当前最高能拦截的导弹高度.输入每个导弹高度的时候就开始处理,遍历每一个拦截系统,一旦最 ...
随机推荐
- idea找不到tools.jar下的内容的解决方法
今天学习javac编译原理时,发现找不到tools.jar. 解决办法:将D:\Program Files\Java\jdk1.8.0_151\lib目录下的tools.jar复制到D:\Progra ...
- python基础之作业2----购物车小练习
product_list = [ ("Iphone",6000), ("Mac pro",12800), ("Bike", ...
- 面试html部分
1.DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动. DOM是文档对象模型的简称 DOM模型中两个节点可能存在的关系有两种:父子关系,兄弟关系. 添加节点:appendChi ...
- 第一周博客之二---OA项目环境搭建及开发包部署
OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...
- Visual Assist X 中使用doxygen的模板注释
http://blog.csdn.net/dhifnoju/article/details/44947213 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C+ ...
- C# 索引和长度必须引用该字符串内的位置 LENGTH
今天遇到了 索引和长度必须引用该字符串内的位置 的问题. 原因是实用 Substring 对字符串进行了前五位的截取,但是忽略了字符串本身不足五位的情况. 如果不足五位,直接将整个字符串赋值过来,添加 ...
- python笔记23-模块导入、安装
模块:import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找 一:导入模块 1.查找环境变量地址: import sysp ...
- NFS 配置文件及在iptables中的配置
yum 安装nfs即可 ( yum install nfs-utils ) cat /etc/exports /data/nfsdata 10.10.10.194(rw,no_root_squash) ...
- Redis高可用方案----Redis主从+Sentinel+Haproxy
安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...
- [模板] 无旋Treap (C++ class)
注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...