题意

https://vjudge.net/problem/CodeForces-1255D

rxc的农场里'R'表示有米,现在有K只鸡,给这k只鸡选一些格子,每个鸡可以有多个格子(每个鸡至少吃一个米),但是每个鸡的格子必须连通。问吃到最多的米和最少的米的差最小是多少。

思路

如果农场一共有cnt个米,那么最优的分配肯定是差值为1或0,即给每个鸡先分cnt/k个米,然后把多余的分配给每个鸡。因为鸡的格子必须是连通的,所以可以考虑类似蛇形填数的方法,每找到cnt/k(多余的类似)个米就换下一只鸡,这样就能保证是连通而且差值最小了。

代码写的有点冗长,我的判断退出的方法是判断当前点的上下左右是否被填过(先把所有位置都赋值成填过,再把rxc的位置赋值为未填过),如果都填过了,那么就结束。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=105;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
char g[N][N],ch,res[N][N];
int a,b,now,vis[N][N],r,c,k;
void gao(int i,int j)
{
vis[i][j]=1;
if(now<a+1&&b)
{
if(g[i][j]=='R')
now++;
res[i][j]=ch;
if(now==a+1)
{
now=0,b--,k--;
if(k<=0)
return ;
if(ch=='9')
ch='A';
else if(ch=='Z')
ch='a';
else ch++;
}
}
else if(now<a&&b==0)
{
if(g[i][j]=='R')
now++;
res[i][j]=ch;
if(now==a)
{
now=0;
k--;
if(k<=0)
return ;
if(ch=='9')
ch='A';
else if(ch=='Z')
ch='a';
else ch++;
}
} }
int main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
memset(vis,-1,sizeof(vis));
int cnt=0;
cin>>r>>c>>k;
for(int i=1; i<=r; i++)
for(int j=1; j<=c; j++)
vis[i][j]=0;
for(int i=1; i<=r; i++)
{
cin>>g[i]+1;
for(int j=1; j<=c; j++)
{
if(g[i][j]=='R')
cnt++;
}
}
a=cnt/k,b=cnt%k,now=0;
int L=1,R=c,U=2,D=r,i=1,j=1;
ch='0';
while(1)
{
int f=0;
while(j<=R)
{
gao(i,j);
j++;
f=1;
}
if(f)
j--; if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
break;
i++;
// cout<<"ggg:"<<i<<" "<<j<<endl;
f=0;
R--;
while(i<=D)
{
gao(i,j);
i++;
f=1;
}
if(f)
i--; if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
break;
j--;
D--;
// cout<<"gg:"<<i<<" "<<j<<endl;
f=0;
while(j>=L)
{
gao(i,j);
j--;
f=1;
}
if(f)
j++; if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
break;
i--;
L++;
// cout<<"gg:"<<i<<" "<<j<<endl;
f=0;
while(i>=U)
{
gao(i,j);
i--;
f=1;
}
if(f)
i++; if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
break;
j++;
U++;
// cout<<"gg:"<<i<<" "<<j<<endl;
}
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
{
cout<<res[i][j];
}
cout<<endl;
} }
return 0;
}

  

最新文章

  1. 采用动态代理方式调用WEB服务(转载+整理)
  2. quick cocos 的scheduler 定时器
  3. Comparable与Comparator
  4. linux下多ISP的策略路由
  5. 关于设置MX记录
  6. oc-17-description
  7. POJ 3369 Meteor Shower (BFS,水题)
  8. 关于system(”pause“);的作用和意义
  9. VS快速定位文件、代码插件——DPack
  10. ASP.NET MVC 以Stream 下载文件
  11. Caused by: java.lang.ClassNotFoundException: javax.transaction.TransactionManager
  12. bookStore第二篇【图书模块、前台页面】
  13. opencv摄像头捕获图像
  14. PowerDesigner 使用教程(很具体,很实用)
  15. VS2017 异常 Editor or Editor Extension
  16. thinkpaidE480office安装文件夹
  17. wpf-X名称空间Attribute
  18. 各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异
  19. linux jdk install and tomcat install
  20. matlab调用规则变量名eval函数

热门文章

  1. NFS共享储存
  2. LG4377 「USACO2018OPEN」Talent Show 分数规划+背包
  3. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程
  4. DRF--路由组件和版本控制
  5. 使用adb安装apk到手机
  6. IT兄弟连 Java语法教程 数据类型2
  7. laravel中select2多选,初始化默认选中项
  8. NumPy 学习 第二篇:索引和切片
  9. JQuery学习笔记(2)——数组 属性 事件
  10. [目录] -- 计划翻译一些有关CLR/C#的基础内容,希望能坚持下去