首页 > 其他分享 >[Codeforces] CF1475C Ball in Berland 题解

[Codeforces] CF1475C Ball in Berland 题解

时间:2023-11-22 21:22:25浏览次数:32  
标签:boy Ball int 题解 t2 t1 CF1475C ans girl

Ball in Berland - 洛谷

题意

在毕业典礼上,有​个男孩和​个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。

现在你知道​个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。

思路

暴力

最朴素,也是简单的方法,就是通过暴力组合进行配对。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6;
int a,b,k,boy[maxn],girl[maxn],ans;
int run()
{
ans=0;
cin>>a>>b>>k;
for(int i=0;i<k;i++) cin>>boy[i];
for(int i=0;i<k;i++) cin>>girl[i];
for(int i=0;i<k;i++)
{
int t1=boy[i],t2=girl[i],flag=1,cnt=0;
for(int j=i+1;j<k;j++)
{
if(t1==boy[j] || t2==girl[j]) flag=0;
else
{
ans++;
}
}
}
cout<<ans;
}

int main()
{
int t;
cin>>t;
while(t--)
{
run();
cout<<endl;
}
}

然而,会在第四个点超时,所以还得优化

利用桶进行优化

我们注意到,超时的原因就是这段代码:

for(int j=i+1;j<k;j++)
{
if(t1==boy[j] || t2==girl[j]) flag=0;
else
{
ans++;
}
}

那么,该怎么进行优化,使其从​变为​呢?

这段代码的用途其实就是在,​后面查找有没有重复出现的人。关注题目中的数据范围:,​,因此可以开一个桶来存储男生和女生各出现的次数,然后再与当前,​作差即可

手玩一下样例:

最开始的桶是这样的:

BOY211 
girl 0 2 1 1

随后,对​进行判断,ans=剩余组数(​)-重复数量(​),即​

然后,桶变成了这样:

BOY111 
girl 0 1 1 1

为了避免重复,每次计算完1组后都需要更新一下对应的男女生人数。进行完​的操作后,​

随后是这样:

BOY011 
girl 0 1 0 1

继续进行如上操作,​,更新桶

接着:

BOY001 
girl 0 0 0 1

当只剩1组时,意味着枚举结束了,并输出​为​

整个程序的时间复杂度是​,CF的机子慢所以算精确点,不会超时

另:十年CF一场空,不开​见祖宗

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+10;
int boy[MAXN],girl[MAXN],a,b,k,ans,bo[MAXN],g[MAXN];
void run()
{
ans=0;
memset(boy,0,sizeof(boy));
memset(girl,0,sizeof(girl));
cin>>a>>b>>k;
for(int i=0;i<k;i++)
{
cin>>bo[i];
boy[bo[i]]++;
}
for(int i=0;i<k;i++)
{
cin>>g[i];
girl[g[i]]++;
}
for(int i=0;i<k;i++)
{
int t1=bo[i],t2=g[i];
ans+=(k-i-1)-(boy[t1]+girl[t2]-2);
boy[t1]--,girl[t2]--;
}
cout<<ans<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--) run();
}

标签:boy,Ball,int,题解,t2,t1,CF1475C,ans,girl
From: https://www.cnblogs.com/lyk2010/p/17850331.html

相关文章

  • 【题解】HD2016.X1,HD2016.X3,HD2016.X4,HD2016.X5
    [HD2016.X1]价钱统计题目描述夏天到了,超市里摆满了各种各样的应季水果。现在知道:西瓜的价钱是每斤1.2元;桃子的价钱是每斤3.5元;葡萄的价钱是每斤4.5元;苹果的价钱是每斤5元。现在分别给出上述四种所购买的斤数(均不超过20),请你编写程序帮助售货员阿姨计算并依次输出顾客......
  • COMP 340 操作系统 Bounded Buffer问题解决
    这里有3个发生器,每个发生器独立地产生一种独特的材料。所有这些材料在被转发给操作员之前被存储在大小为10的输入缓冲器中。我们有三个具有相同优先级的运营商,他们负责生产基于这些材料。每种产品需要2种不同的材料。每次操作员需要2个用于此目的的工具。总共为这些操作员提供了3......
  • composer无法下载问题解决
    composerrequirejaeger/querylist[Composer\Downloader\TransportException] The"https://packagist.phpcomposer.com/p/provider-2017%241fcb04ee223fce21d167c8a49f09025ba85c917aee976588a99ef82c3a a609dc.json"filecouldnotbedownloaded(HTTP/1.......
  • P8907 [USACO22DEC] Making Friends P 题解
    明明看着不难的题目,却意外的卡人。思路考虑两头奶牛可以成为朋友条件是什么。存在一条路径连接这两头奶牛。且除去端点外的路径上的所有点的编号小于两端点的较小值。充分必要性都比较显然。如何维护。我们可以从小到大加入点,维护这些路径。对于每个点维护一个\(\text{se......
  • 【luogu题解】P9749 [CSP-J 2023] 公路
    \(Meaning\)\(Solution\)这道题我来讲一个不一样的解法:\(dp\)在写\(dp\)之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示。状态的表示\(dp[i]\)表示到达第\(i\)个站点所需要的最少钱数,\(w[i]\)表示在使用最少钱数到达第\(i\)个站点时多余......
  • 【模板】最小度限制生成树 题解
    其他的题解感觉都好高级,分享一种好想且好实现的方法。我们可以先把点\(s\)和与其相连的边都删除,我们发现剩下的部分变成了一些连通块。我们不难发现,当要求与\(s\)点相连的边的个数为\(k\)时,我们的连通块个数显然是\(k\)的。接下来这个问题就转化成了:\(n-1\)个点中生......
  • [IOI2015] Teams 题解
    妙妙题。不难发现,我们对于每个\(k\)取出的人都是满足\(a_i\leqk\leqb_i\)的。经典的,我们直接将\((a_i,b_i)\)转化到二维平面上,将它转化成一个二维数点问题。我们对于每一个询问,都使\(k\)有序,从小到大贪心的选择,也就相当于\(x\)轴限制不断向右,\(y\)轴限制不断......
  • zookeeper3.5.5以上8080端口占用问题解决
    zookeeper3.5.5启动默认会把AdminService服务启动,这个服务默认是8080端口,是一个通过jetty启动的管理控制台,一般不会用到,网上的复制粘贴就是来自同一个办法如下:方法一、删除jetty方法二、修改端口。修改方法的方法有两种:在启动脚本中增加-Dzookeeper.admin.serverPort=你的端......
  • P9868 题解
    blog。NOIP2023T1。可以对字符串随意交换,即可以重排每个单词。对于询问\(i\),最优方案显然是将\(\forallj\nei\)的\(w_j\)重排至字典序最大,将\(w_i\)重排至字典序最小。这件事情本质是将\(w_i\)与\(\min\limits_{j\nei}w_j\)比较。在开始时将全部串重排至字典序......
  • 【AGC】鸿蒙应用软件包上传问题解析
    ​【问题背景】近期收到了一些反馈,一些鸿蒙元服务开发者在发布应用市场的过程中,上传.app包时遇到了不同的报错,导致上传失败,下面来看一下这些报错的具体原因,如何正确打包上传。 【问题描述1】HarmonyOS元服务软件包上传后,提示“软件包解析失败,请重新上传”,错误详情(5)​​​【......