博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【THUSC2017】巧克力
阅读量:5334 次
发布时间:2019-06-15

本文共 2416 字,大约阅读时间需要 8 分钟。

题目描述

​“人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。”

​ 明明收到了一大块巧克力,里面有若干小块,排成nm列。每一小块都有自己特别的图案ci,j,它们有的是海星,有的是贝壳,有的是海螺......其中还有一些因为挤压,已经分辨不出是什么图案了。明明给每一小块巧克力标上了一个美味值ai,j ( 0ai,j106 ),这个值越大,表示这一小块巧克力越美味。

​正当明明咽了咽口水,准备享用美味时,舟舟神奇地出现了。看到舟舟恳求的目光,明明决定从中选出一些小块与舟舟一同分享。

​舟舟希望这些被选出的巧克力是连通的(两块巧克力连通当且仅当他们有公共边),而且这些巧克力要包含至少k ( 1k5 )种。而那些被挤压过的巧克力则是不能被选中的。

​ 明明想满足舟舟的愿望,但他又有点“抠”,想将美味尽可能多地留给自己。所以明明希望选出的巧克力块数能够尽可能地少。如果在选出的块数最少的前提下,美味值的中位数(我们定义n个数的中位数为第n+12小的数)能够达到最小就更好了。

​ 你能帮帮明明吗?

输入格式

从标准输入读入数据。

​ 每个测试点包含多组测试数据。

​ 输入第一行包含一个正整数 T (1T5),表示测试数据组数。

​ 对于每组测试数据:

​ 输入第一行包含三个正整数n,mk

​ 接下来n行,每行m个整数,表示每小块的图案ci,j。若ci,j=1表示这一小块受到过挤压,不能被选中;

​ 接下来n行,每行m个整数,表示每个小块的美味值ai,j

输出格式

输出到标准输出。

​ 输出共包括T行,每行包含两个整数,用空格隔开,即最少的块数和最小的美味值中位数。

​ 若对于某组测试数据,不存在任意一种合法的选取方案,请在对应行输出两个1

数据范围 n×m233 ci,j=11ci,jn×m


 

 

 

 题解:

    • 二分一个出现过的美味度做中位数,考虑如何$check$;
    • 而判断一个数$x$>=中位数,只要在数列里面找到至少$\lfloor \frac{n+1}{2} \rfloor$个小于等于$x$的数即可;
    • 将$a_{ij}$大于中位树的设为$1001$,小于等于的设为$999$
    • 在满足连通和颜色的条件下取尽量小的代价和就做到了个数做第一关键字,中位数做第二关键字;
    • 所以每次将(最小值+500)/1000得到个数,将最小值和个数*1000比较,如果小于等于证明合法;
    • 具体地求最小值:
    • 将颜色在$0-k$内随机一个新颜色,考虑新颜色$0-k$全都取就取了$k$种,多随机几次;
    • 每次斯坦纳树求出最小代价;
    • $spfa$算满的话是:$O(T* t *(nm \ 3^{k} + (nm)^2 \ 2^k) )$;
    • 感觉整个题充满了脑洞。。。。
    •  (最开始写的解法里面,等于的设置成1000,在最小个数为偶数的情况下会wa,希望没有坑到太多人。。。。。)

    • 1 #include
      2 #define inf 0x3f3f3f3f 3 #define fir first 4 #define sec second 5 #define mk make_pair 6 using namespace std; 7 const int N=250; 8 int n,m,k,a[N][N],c[N][N],sub[N],tot,f[N][N][1<<5],id[N][N],col[N],b[N][N],ans1,ans2,vis[N][N]; 9 typedef pair
      pii;10 queue
      q;11 int dx[4]={
      0,0,1,-1};12 int dy[4]={
      1,-1,0,0}; 13 void spfa(int s){14 while(!q.empty()){15 int x=q.front().fir, y=q.front().sec;16 q.pop();vis[x][y]=0;17 for(int i=0;i<4;i++){18 int nx=x+dx[i], ny=y+dy[i];19 if(nx<1||nx>n||ny<1||ny>m||!~c[nx][ny])continue;20 if(f[nx][ny][s] > f[x][y][s] + b[nx][ny]){21 f[nx][ny][s] = f[x][y][s] + b[nx][ny];22 if(!vis[nx][ny])vis[nx][ny]=1,q.push(mk(nx,ny));23 }24 }25 }26 }27 void steiner(){28 for(int i=1;i<=n;i++)29 for(int j=1;j<=m;j++){30 for(int s=0;s<1<
      >1;61 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]=a[i][j]>sub[mid]?1001:/*a[i][j]
      THUSC2017D1T1

       

 

转载于:https://www.cnblogs.com/Paul-Guderian/p/10246851.html

你可能感兴趣的文章
redux-effect
查看>>
Swift和OC混编
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>