happiness[国家集训队2011(吴确)]

【试题来源】

2011中国国家集训队命题答辩

【问题描述】

高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

【输入格式】

第一行两个正整数n,m。
接下来是六个矩阵
第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。
第二个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。
第三个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。
第四个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。
第五个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。
第六个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。

【输出格式】

输出一个整数,表示喜悦值总和的最大值

【样例输入】

1 2
1 1
100 110
1
1000

【样例输出】

1210

【样例说明】

两人都选理,则获得100+110+1000的喜悦值。

【数据规模和约定】

对于10%以内的数据,n,m<=4
对于30%以内的数据,n,m<=8
对于100%以内的数据,n,m<=100 数据保证答案在2^30以内
对于100%的数据,时间限制为0.5s。
【题解】
    这道题的难点在于确定边权。最小割问题,割去的就是我们失去的部分;两点之间有关系,总是通过建边来实现的。对于这道题来说,每种情况我们都失去了什么?以源点代表文科,汇点代表理科。都选一科(三角环),失去了共同选另一科和分别选另一科的喜悦值。分别选两科(二字形),失去了两个共同喜悦值和两个单独选另一科的喜悦值。(可以证明可能出现的情况只有这两种,否则都不会是最小割)相同位置的边权构成一定相同,因此用数学方法推出每个人到源点或汇点的边权为个人喜悦值+1/2共同喜悦值,两点之间边权为1/2都选文+1/2都选理。注意共同边要双向建边,因为两点之间是完全等效的;每个人向源点和汇点的边应该在边权全部处理完之后再统一添加。
    可以发现边权会出现实型,结果却一定是整型。对于这种情况,可以把边权全部*2,最后结果再/2来避免double的麻烦。dfs函数中有一个语句:if(!f) break;原先从来没打过,这道题不加这个却会超时,加了之后直接上榜,确实是一个非常有理有据的优化。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int sj=105;
int n,m,sx[sj][sj],e,h[sj*sj],s,t,dep[sj*sj];
int w[sj][sj],l[sj][sj],g[sj][sj],z[sj][sj],a1,ans;
struct B
{int ne,v,w;
}b[sj*sj*10];
queue<int> q;
void add(int x,int y,int z)
{b[e].v=y;b[e].w=z;b[e].ne=h[x];h[x]=e++;
}
void init()
{scanf("%d%d",&n,&m);t=n*m+1;memset(h,-1,sizeof(h));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&w[i][j]);sx[i][j]=(i-1)*m+j;ans+=w[i][j];w[i][j]*=2;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&l[i][j]);ans+=l[i][j];l[i][j]*=2;}for(int i=1;i<n;i++)for(int j=1;j<=m;j++){scanf("%d",&a1);ans+=a1;g[i][j]=a1;w[i][j]+=a1;w[i+1][j]+=a1;}for(int i=1;i<n;i++)for(int j=1;j<=m;j++){scanf("%d",&a1);ans+=a1;g[i][j]+=a1;l[i][j]+=a1;l[i+1][j]+=a1;add(sx[i][j],sx[i+1][j],g[i][j]);add(sx[i+1][j],sx[i][j],g[i][j]);}for(int i=1;i<=n;i++)for(int j=1;j<m;j++){scanf("%d",&a1);ans+=a1;z[i][j]=a1;w[i][j]+=a1;w[i][j+1]+=a1;add(s,sx[i][j],w[i][j]);add(sx[i][j],s,0);}for(int i=1;i<=n;i++){add(s,sx[i][m],w[i][m]);add(sx[i][m],s,0);}for(int i=1;i<=n;i++)for(int j=1;j<m;j++){scanf("%d",&a1);ans+=a1;z[i][j]+=a1;l[i][j]+=a1;l[i][j+1]+=a1;add(t,sx[i][j],0);add(sx[i][j],t,l[i][j]);add(sx[i][j],sx[i][j+1],z[i][j]);add(sx[i][j+1],sx[i][j],z[i][j]);}for(int i=1;i<=n;i++){add(sx[i][m],t,l[i][m]);add(t,sx[i][m],0);}ans*=2;
}
bool bfs(int x)
{while(!q.empty()) q.pop();memset(dep,0,sizeof(dep));dep[x]=1;q.push(x);while(!q.empty()){x=q.front();q.pop();for(int i=h[x];i!=-1;i=b[i].ne)if(!dep[b[i].v]&&b[i].w){dep[b[i].v]=dep[x]+1;if(b[i].v==t) return 1;q.push(b[i].v);}}return 0;
}
int bj(int x,int y)
{return x<y?x:y;
}
int dfs(int x,int f)
{if(x==t) return f;int ans=0,d;for(int i=h[x];i!=-1;i=b[i].ne)if(dep[b[i].v]==dep[x]+1&&b[i].w){d=dfs(b[i].v,bj(f,b[i].w));f-=d;ans+=d;b[i].w-=d;b[i^1].w+=d;if(!f) break;}if(!ans) dep[x]=-1;return ans;
}
int main()
{init();while(bfs(s))  ans-=dfs(s,0x7fffffff);printf("%d",ans/2);return 0;
}
happiness

 

转载于:https://www.cnblogs.com/moyiii-/p/7265199.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sketch怎么移动图层_什么是Photoshop Express,Fix,Mix和Sketch移动应用程序?

sketch怎么移动图层Adobe’s approach to mobile apps seems to be “The More, The Better”. Right now, there are five Photoshop branded apps available for iOS and Android. Adobe的移动应用程序方法似乎是“越多越好”。 目前&#xff0c;有五个适用于iOS和Android的P…

imessage_如何在iPhone和iPad上的iMessage组中提及某人

imessageKhamosh PathakKhamosh PathakSometimes, it’s difficult to get someone’s attention in a large iMessage group chat on your iPhone or iPad. However, if you mention that person specifically in a message, your friend will receive a notification about i…

点击右侧导航栏,实现iframe嵌入子页面中div,滑动到最上面

2019独角兽企业重金招聘Python工程师标准>>> // 点击对应的nav里的li标签,页面就滚动到哪里 $(.title-list > li).click(function(event) {$(this).addClass(active).siblings().removeClass(active);//li标签里面有a标签,可以阻止到a标签的默认行为event.preven…

wepack环境配置1之node的安装

.向往已久的webpack终于配好了.. 1.要安装webpack&#xff0c;首先需要安装nodejs nodejs下载地址:https://nodejs.org/en/ 下载完成后,一步步安装即可,我是安装到D盘 新建一个nodejs的文件夹,装到这个文件夹里面即可. 安装完毕后检查自己是否安装成功.启动cmd,然后输入npm -v,…

【赏析】.NET跨平台框架-Avalonia UI

这是Avalonia UI官方的一个Demo&#xff0c;站长对部分Nuget包进行了升级&#xff0c;网友【小飞机MLA】对Linux版本修复了字体Bug得以正常运行、演示&#xff1a;Windows 11&#xff1a;macOS 13&#xff1a;可安装Rider&#xff08;EAP即要&#xff09;开发&#xff0c;站长一…

office自定义安装选项_如何自定义Office 2013中功能区上的现有选项卡

office自定义安装选项The Ribbon in Microsoft Office 2013 provides quick access to many features and options by default, but it can be further customized to fit the way you use it. You can add a custom tab to the ribbon or you can add commands to the existin…

Centos6.8 安装spark-2.3.1 以及 scala-2.12.2

一、Spark概述 Spark 是一个用来实现快速而通用的集群计算的平台。 在速度方面&#xff0c;Spark 扩展了广泛使用的 MapReduce 计算模型&#xff0c;而且高效地支持更多计算模式&#xff0c;包括交互式查询和流处理。 在处理大规模数据集时&#xff0c;速度是非常重要的。速…

聊一聊 WPF 程序的键盘是如何被窃听的?

一&#xff1a;背景 1.讲故事前几天群里很热闹&#xff0c;看了下在争论两个问题&#xff1a;电脑里要不要装杀毒软件 ?应该装什么杀毒软件 ?不管杀毒软件流氓不流氓&#xff0c;在如今病毒肆虐的当下互联网&#xff0c;装一个还是能帮我们拦截很多意想不到的东西&#xff0c…

httpclient 实现文件上传中转

开发功能&#xff1a; web前端提交上传文件 —> a服务器接收 —> 转发到b服务器进行文件处理 下面是简单实现的代码&#xff0c;具体细节优化根本自己的需求更改。 public String handleResponse(HttpServletRequest request, HttpServletResponse response)throws Unsup…

AngularJS $watch 性能杀手

双向绑定是AngularJS核心概念之一&#xff0c;它给我们带来了思维的转变&#xff0c;不再是以DOM为驱动&#xff0c;而是以Model为核心&#xff0c;View中写上声明式标签&#xff08;指令或{{}}&#xff09;,AngularJS会在后台默默同步View到Model,并将Model的变化更新到View。…

ipad和iphone切图_如何在iPhone和iPad上的Messages App中固定对话

ipad和iphone切图Khamosh PathakKhamosh PathakBetween updates from your bank and group chats, the Messages app on your iPhone or iPad can be a mess. Use the pinned conversations feature introduced in iOS 14 and iPadOS 14 to access your favorite conversations…

这个WPF的企业级MES项目爆火,就是UI争议大!

工业4.0时代&#xff0c;智能智造MES系统大行其道&#xff0c;然而基于.NET跨平台的罕见&#xff01;这里有一套《.NET6WPF企业级MES实战》教程&#xff0c;基于.NET6跨平台开发&#xff0c;实现了MES多核心功能&#xff0c;尤其是开发框架完整&#xff0c;非常适合复用。这里分…

单调栈学习笔记

线性结构——单调栈①定义&#xff1a;栈内的元素&#xff0c;按照某种方式排序&#xff08;单调递增或单调递减&#xff09;如果新入栈的元素破坏了单调性&#xff0c;就弹出栈内元素&#xff0c;直到满足单调性②优点&#xff1a;可以很方便地求出某个数左边或者右边第一个比…

《VMware Virtual SAN权威指南(原书第2版)》一1.5 什么是Virtual SAN

1.5 什么是Virtual SAN Virtual SAN是VMware推出的一种存储解决方案&#xff0c;它的beta版本在2013年发布&#xff0c;2014年3月正式开放给公众&#xff0c;并于2016年3月升级到6.2版。VSAN完全集成在vSphere中&#xff0c;它是一种基于对象的存储系统&#xff0c;是虚拟机存…

在Outlook 2007中查看您的Google日历

Google Calendar is a phenomenal web application for managing your calendars, but so many of us are still forced to use Outlook at work. The good thing is you can have the best of both worlds by subscribing to your Google Calendar from Outlook. Google日历是…

元宇宙、数字孪生和企业NFT

昨天参加了华为云上海开发者日活动&#xff0c;并客串主持了一场"元宇宙技术创新和商业实践之路"的闭门研讨会。研讨会上大家讨论热烈&#xff0c;干货多多&#xff0c;大家提到元宇宙的企业级前景、数字藏品和数字人案例的亲身体会。在会上盆盆分享了自己关于企业级…

CMD命令硬盘/光驱挂载

使用Mountvol命令挂载时&#xff0c;发现GUID不对啊&#xff0c;哪应该到哪找呢&#xff1f; 1.首先可以用Mountvol命令&#xff1a; Mountvol 创建、删除或列出卷的装入点。Mountvol 是一种不需要驱动器号而连接卷的方式。 语法&#xff1a; mountvol [Drive:]Path VolumeName…

纽约大街上的免费WiFi,终于铺起来了

纽约市的城市互联网项目终于开始动工了。 这个被称为 LinkNYC 的网络服务项目&#xff0c;是将现有的 1 万多个付费电话亭改造成提供 Wi-Fi 网络的“热点桩”&#xff0c;为纽约市民提供免费网络。从 12 月 28 日开始&#xff0c;工人们已经开始安装首批的 LinkNYC 热点桩了&am…

reddit_如何将多个子Reddit与多个Reddit合并

redditchrisdorney/Shutterstock.comchrisdorney / Shutterstock.comIf you’re subscribed to a lot of communities on Reddits, some of the content you want to see may get lost in the mix. For easier browsing, you can make your own “multireddit” that combines …

BeetleX之ServerBuilder对象使用

ServerBuilder是BeetleX新版本添加对象&#xff0c;用于进一步简化TCP服务的构建。ServerBuilder对象提供两个泛型版本&#xff1a;一个是针对网络数据流操作&#xff0c;另一个则针对协议解释器的对象处理操作。网络数据流当需要解释简单的网络数据流时使用ServerBuilder<A…