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. Jquery的Ajax中contentType和dataType的区别(转载)

    上代码 $.ajax({ type: httpMethod, cache: false, contentType: "application/json; charset=utf-8" ...

  2. C# WPF xml序列化 反序列化

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  3. 20155238 2016-2017-2《Java程序设计》课程总结

    每周作业链接汇总(按顺序) 预备作业1 预备作业2 预备作业3 第一周作业 第二周作业 第三周作业 第四周作业 第五周作业 第六周作业 第七周作业 第八周作业 第九周作业 第十周作业 自认为写得最好一 ...

  4. typedef你真的理解么?

    typedef,用最简单的话去诠释他,那么就是给类型取别名!!!  但是他并没有你想象的那么简单! 举例: typedef int size;//那么int就有一个别名叫size了,以后就可以 siz ...

  5. [C#源代码]使用SCPI指令对通信端口(RS232/USB/GPIB/LAN)进行仪器编程

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本软件是基于NI-VISA/VISA32(Virtual Instrument Softwar ...

  6. 5、Docker网络配置(单机)

    一.概述 以下内容参考:https://docs.docker.com/network/#network-drivers Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连 ...

  7. effective c++ 笔记 (30-31)

    //---------------------------15/04/17---------------------------- //#30   透彻了解inlineing的里里外外 { /* 1: ...

  8. kubernetes 网络故障遇见的坑

    1.记录一下自己搭建kubernetes 集群遇见的坑. 过程是我学技术以来最大的bug,处处都是坑,稍微写成一点, 就完全起不来, 起不来之后, 还找不到故障点, 郁闷之极. 后续会慢慢分享给大家. ...

  9. H5游戏接微信小游戏的支付,满满的都是坑!

    h5小游戏接微信的支付,简直是在为难我胖虎,说多了都是泪. 准备工作: 准备工作一定要做好,不然很容易出错.首先是session_key这个字段,这个session_key是登录的时候需要用到的,根据 ...

  10. python 游戏(猜单词Hangman)

    1.游戏思路和流程图 实现功能:随机一个单词让玩家猜测(后续难度实现修改为成语填空,成语必须要有提示,可修改猜的次数,增加连续猜成语,难度系数随着次数的增加而增加) 游戏流程图 2. 单词库和模块 i ...