题目

[USACO14MAR]Counting Friends G

题解

这道题我们可以将 \((n+1)\) 个边依次去掉,然后分别判断去掉后是否能满足。注意到一点, \(n\) 个奶牛的朋友之和必定为偶数,所以去掉的那个数值的奇偶性必定与 \((n+1)\) 个数值之和的奇偶性相同。

接下来很明显的,尽量将朋友多的和朋友多的匹配,所以先从大到小排序,将第一个奶牛和后面的奶牛依次匹配,如果匹配结束,第一个奶牛还有剩余,则此情况必然不可能成立;否则匹配完之后再按照 \(O(n)\) 复杂度的归并排序给数组重新排好序。依次循环 \(n\) 次(当然如果数组中最大值已经为 \(0\) ,则直接跳出循环)。

简单说一下为什么这样做是正确的,因为奶牛无法完成匹配只可能有一种情况,就是当某一个奶牛与其他所有还可以有朋友的奶牛都匹配结束后,此奶牛依然还有剩余的朋友要匹配。所以奶牛要尽量先与朋友多的奶牛相匹配,如果先与朋友较少的奶牛匹配,则会加大朋友较多的奶牛无法完成匹配的可能性。具体严格证明应该可以用数学归纳法来证,这里就不详述了。

代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, a[502], b[500],c[500],sum=0;
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
int num = 0, res[501];
for (int i = 1; i <= n + 1; i++)
{
if (sum % 2 != a[i] % 2)
continue;
int index = 0;
for (int j = 1; j <= n + 1; j++)
if (j != i)
b[index++] = a[j];
sort(b, b + n, [](const int x, const int y) {
return x > y;
});
bool flag = 1;
for (int j = 1; j <= n; j++)
{
if (b[0] == 0)
break;
int in = 1;
while (b[0] > 0 && b[in] > 0)
{
b[0]--;
b[in++]--;
}
if (b[0] > 0)
{
flag = 0;
break;
}
int p = 1, q = in, cnt = 0;
while (p < in && q < n)
if (b[p] > b[q])
c[cnt++] = b[p++];
else
c[cnt++] = b[q++];
while (p < in)
c[cnt++] = b[p++];
while (q < n)
c[cnt++] = b[q++];
for (int k = 0; k < n - 1; k++)
b[k] = c[k];
b[n - 1] = 0;
}
if (flag)
res[num++] = i;
}
printf("%d\n", num);
for (int i = 0; i < num; i++)
printf("%d\n", res[i]);
return 0;
}

洛谷P3104 Counting Friends G 题解的更多相关文章

  1. 【题解】洛谷P3119 Grass Cownoisseur G

    题面:洛谷P3119 Grass Cownoisseur G 本人最近在熟悉Tarjan的题,刷了几道蓝题后,我飘了 趾高气扬地点开这道紫题,我一瞅: 哎呦!这不是分层图吗? 突然就更飘了~~~ 用时 ...

  2. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  3. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  4. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  5. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  6. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  7. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

  8. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  9. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...

随机推荐

  1. 大数据学习(18)—— Flume介绍

    老规矩,学习新东西先上官网瞅瞅Apache Flume Flume是什么 Flume是一个分布式.可靠的大规模高效日志收集.汇聚和传输的这么一个服务.它的架构基于流式数据,配置简单灵活.它具备可调节的 ...

  2. Python爬虫+可视化教学:爬取分析宠物猫咪交易数据

    前言 各位,七夕快到了,想好要送什么礼物了吗? 昨天有朋友私信我,问我能用Python分析下网上小猫咪的数据,是想要送一只给女朋友,当做礼物. Python从零基础入门到实战系统教程.源码.视频 网上 ...

  3. 手把手教centos安装docker

    目录 版本说明 官网安装教程 安装docker 现在网络上安装教程满天飞,很大一部分是别人的总结,可以说是成果,却没有介绍如何去实现这个成果方法.这篇就结合官网教程来聊聊如何在centos上安装doc ...

  4. 教你如何使用FusionInsight SqoopShell

    摘要:Sqoop-shell是一个Loader的shell工具,其所有功能都是通过执行脚本"sqoop2-shell"来实现的. 本文分享自华为云社区<FusionInsig ...

  5. JUC学习笔记(二)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html 1.Lock接口 1.1.Synchronized 1.1.1.Synchronized关 ...

  6. vue源码解析之响应式原理

    关于defineReactive等使用细节需要自行了解 一些关键知识点 $mount时 会 new Watcher 把组件的 updateComponent 方法传给watcher 作为getter ...

  7. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  8. Linux搭建SQL server服务器

    我们知道在Linux下安装服务有很多方式,最为简单的也就是yum安装,但是很多服务通过yum是无法安装的,如果想使用yum安装,需要指定yum安装仓库,我们今天需要安装MSQL Server,所以需要 ...

  9. git忽略文件夹提交以及gitignore修改后不生效的解决办法

    1.在 .gitgnore 文件加入需要忽略的问价夹正则表达式: 在配置完以后提交代码,你可能会发现git忽略配置不生效! 解决办法,将缓存的文件重新添加一下即可 2.打开命令行,将下面三个命令复制粘 ...

  10. 小白5分钟创建WPF

    创建WPF应用程序 基于生产这里选择.Net Framework进行开发 添加控件 由于不熟悉 高效点 我们这里直接拖拽控件 如果你有一点前端基础 你可以在控件对应Code 根据属性 对控件进行设置 ...