DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了...

题意是把一堆字母分别分配到行和列.

分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和"在行和列都出现的字母有关"

结论1:最优方案中如果答案不为0,那么存在一种最优方案,满足只有一种字母在行和列都出现,其他字母要么只在行出现,要么只在列出现

假设有两种字母,分别在行和列都出现了,那么就可以通过在行/列之间交换这两种字母使得只有一种字母在行和列中都出现,且答案变小

结论2:如果最优方案中答案不为0且存在一种字母在行和列中都出现,那么其他种类的字母一定都用完了.

假设其他种类的字母没有用完,那么拿没用完的其他种类的字母,替换在行和列中都出现的字母,就可以使答案变小.

有这两个结论,就可以写写背包进行判断了.

#include<cstdio>
#include<algorithm>
using namespace std;
char buf[200005];
void read(int *a){
scanf("%s",buf);
for(int i=0;buf[i]!='\0';++i)a[buf[i]-'A']++;
}
bool f[30005];
bool check0(int *a,int n,int m,int k){
int lim=n<m?m:n;
int ano=n+m-lim;
for(int i=0;i<=k;++i)f[i]=0;
f[0]=true;
for(int i=0,sum=0;i<26;++i){
if(a[i]==0)continue;
sum+=a[i];
for(int j=sum;j>=a[i];--j){
f[j]|=f[j-a[i]];
}
}
for(int i=lim;i<=k-ano;++i){
if(f[i])return true;
}
return false;
}
long long check(int *a,int n,int m,int k,int tmp){
int lim=n<m?n:m;
int ano=n+m-lim;
for(int i=0;i<=lim;++i)f[i]=0;
f[0]=true;
for(int i=0,sum=0;i<26;++i){
if(a[i]==0)continue;
sum+=a[i];
for(int j=sum;j>=a[i];--j){
f[j]|=f[j-a[i]];
}
}
long long ans=1ll<<60;
for(int i=0;i<=lim;++i){
if(f[i]&&k-tmp-i<=ano&&(lim-i)+(ano-(k-tmp-i))<=tmp)ans=min(ans,(lim-i)*1ll*(ano-(k-tmp-i)));
}
return ans;
}
int main(){
int t;scanf("%d",&t);
while(t--){
int n,m,k;scanf("%d%d%d",&n,&m,&k);
int cnt[26];
for(int i=0;i<26;++i)cnt[i]=0;
read(cnt);
if(check0(cnt,n,m,k))printf("0\n");
else{
long long ans=1ll<<60;
for(int i=0;i<26;++i){
int tmp=cnt[i];
cnt[i]=0;
ans=min(ans,check(cnt,n,m,k,tmp));
cnt[i]=tmp;
}
printf("%lld\n",ans);
}
}
return 0;
}

CF 1070J Streets and Avenues in Berhattan的更多相关文章

  1. Codeforces 1070J Streets and Avenues in Berhattan dp

    Streets and Avenues in Berhattan 我们首先能发现在最优情况下最多只有一种颜色会分别在行和列, 因为你把式子写出来是个二次函数, 在两端取极值. 然后我们就枚举哪个颜色会 ...

  2. CodeForces 1070J Streets and Avenues in Berhattan 性质+动态规划

    题目大意: 你有$k$个数,分为$26$种 对于每个数,你可以选择选进$A$集合或者$B$集合或者不选 要求$A$集合中必须有$n$个数,$B$集合中必须有$m$个数 记第$i$种数在$A$集合中的个 ...

  3. 2018-2019 ICPC, NEERC J. Streets and Avenues in Berhattan(DP)

    题目链接:https://codeforc.es/contest/1070/problem/J 题意:给出一个长度为 k 的字符串,选出 n 个和 m 个不同位置的字符构成两个字符串,使得两个字符串相 ...

  4. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  5. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  6. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution

    A. Find a Number Solved By 2017212212083 题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$ 思路: 定义一个二元组$< ...

  7. Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结

    第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...

  8. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  9. poj 1806 分块模拟

    Manhattan 2025 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1318   Accepted: 703 Des ...

随机推荐

  1. js获取当前日期,并计算几天后日期

    获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS” function getNowFormatDate() { var date = new Date(); var seperator ...

  2. ceph维护

    一个节点挂了,重新添加硬盘并格式化成xfs文件系统挂载到原来的位置后ceph osd无法启动.使用ceph osd tree查看处于down状态.A:移除掉这个osd,1:ceph osd out o ...

  3. 第15章 RCC—使用HSE/HSI配置时钟

    第15章     RCC—使用HSE/HSI配置时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...

  4. Flask安装教程

    第1步:确保本机已经安装有python,下载easy_install到本地某一目录,双击ez_setup.py,python将自动下载到python安装目录/Scripts 下面,然后在系统环境变量的 ...

  5. tensorflow batch

    这两天一直在看tensorflow中的读取数据的队列,说实话,真的是很难懂.也可能我之前没这方面的经验吧,最早我都使用的theano,什么都是自己写.经过这两天的文档以及相关资料,并且请教了国内的师弟 ...

  6. 5、JVM的监控与分析工具

    一.JPS(虚拟机进程监控工具) 二.jstat:虚拟机统计信息监视工具 例子:jstat -gcutil 16478 s0:区域占比2.33%: s1占比0.00%: E:伊甸园区 : O:老年区: ...

  7. 洛咕 P4491 [HAOI2018]染色

    显然颜色数量不会超过\(lim=\min(m,n/S)\) 考虑容斥,计算恰好出现了\(S\)次的颜色有至少\(i\)种的方案数\(f[i]\),钦定\(i\)种颜色正好放\(S\)种 有\(m\)种 ...

  8. [CF1017G]The Tree[树链剖分+线段树]

    题意 给一棵一开始 \(n\) 个点全是白色的树,以 \(1\) 为根,支持三种操作: 1.将某一个点变黑,如果已经是黑色则该操作对所有儿子生效. 2.将一棵子树改成白色. 3.询问某个点的颜色. \ ...

  9. Partition3:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

  10. Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法

    Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法 先上个图.语法提示支持到 Microsoft Dynamics xRM API 8.2 也就是cr ...