首页 > 其他分享 >Atcoder ABC144E Gluttony

Atcoder ABC144E Gluttony

时间:2024-03-24 23:23:29浏览次数:20  
标签:Atcoder Gluttony ABC144E int sum 队员 样例 long 食物

[ABC144E] Gluttony

题面翻译

【题目描述】

高桥君参加大胃王比赛。比赛由 \(N\) 人组成的团队为基本单位参赛,高桥君的队伍的队员从 \(1\sim N\) 编号。第 \(i\) 名队员的消化代价为 \(A_i\)。

比赛有 \(N\) 种不同的食物,每位队员需要负责吃掉其中一种食物,不能有两名队员吃同一种食物,也不能让一名队员吃多与一种食物。第 \(j\) 种食物的难吃程度为 \(F_j\)。 消化代价 \(x\) 的队员吃完难吃程度 \(y\) 的食物需要花费 \(x\times y\) 秒。 整个队伍的成绩是 \(N\) 名队员吃完食物花费时间的最大值。

比赛前,高桥君的队伍会进行修行。一次修行可以将一名消化代价大于 \(0\) 的队员的消化代价减少 \(1\)。由于修行需要消耗庞大的食费,因此最多只能进行 \(K\) 次修行。

通过修行和适当选择每位队员吃的食物,高桥队在比赛中能够获得的最好成绩是多少?

【输入格式】

第 \(1\) 行,两个正整数 \(N,K\)。

第 \(2\) 行,\(N\) 个正整数 \(A_1,A_2,\cdots,A_N\)。

第 \(3\) 行,\(N\) 个正整数 \(F_1,F_2,\cdots,F_N\)。

【输出格式】

输出高桥队的最好成绩。

样例 #1

样例输入 #1

3 5
4 2 1
2 3 1

样例输出 #1

2

样例 #2

样例输入 #2

3 8
4 2 1
2 3 1

样例输出 #2

0

样例 #3

样例输入 #3

11 14
3 1 4 1 5 9 2 6 5 3 5
8 9 7 9 3 2 3 8 4 6 2

样例输出 #3

12

思路

以下简称消化代价为a,难吃程度为f.

样例是好样例,通过简单归纳,发现要把a大的乘上f小的,a小的则要乘f大的,这样能使\(\sum_{i = 1}^{n} a_i f_j,0≤i≤n,0≤j≤n,i+j=n\)最小,即最优解。于是将a数组sort成升序,而f组与a组刚好相反,所以降序。

但是,这N个人还可以进行K次修改,怎么办呢?我们考虑二分消化时间最小值x。当\(a_i f_j<t\)时,将\(a_i f_j - t\),再取它整除\(f_j\)的结果,即\(训练过的 a_i\),此时的\(a_i f_j < t\),即满足答案x的结果。

代码

#include<bits/stdc++.h>
using namespace std;
int a[200005],f[200005];
long long n,k;
bool cmp(int &x,int &y)
{
	return x>y;
}
bool check(long long x)
{
	long long sum=0;
	for(int i=1;i<=n;i++)
	{
		if(1ll*a[i]*f[i]>x)
		{
			sum+=(1ll*a[i]*f[i]-x+f[i]-1)/f[i];
		}
	}
	return sum<=k;
}
int main()
{
	ios::sync_with_stdio(false);
	
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>f[i];
	}
	sort(a+1,a+n+1);
	sort(f+1,f+n+1,cmp);//降序排列 
	
	long long l=0,r=1e12+5,ans=0;
	while(l<=r)
	{
		long long mid=(l+r)/2;
		if(check(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	cout<<ans<<endl;
	return 0;
}

标签:Atcoder,Gluttony,ABC144E,int,sum,队员,样例,long,食物
From: https://www.cnblogs.com/j1hx-oi/p/18093326

相关文章

  • AtCoder Beginner Contest 346 题解
    A-AdjacentProductQuestion给你\(N\)个整数\(A_1,A_2,\dots,A_N\)。同时,定义\(B_i=A_i\timesA_{i+1}\(1\leqi\leqN-1)\)按此顺序打印\(B_1,B_2,\dots,B_{N-1}\)Solution按照题意模拟Code#include<bits/stdc++.h>usingnamespacestd;intmain......
  • AtCoder Beginner Contest 346
    AtCoderBeginnerContest346最刺激的一集。尝试挑战手速极限,用了57s做A。但是好像还是很慢。然后做B,仍然想挑战手速。结果一眼出思路只要把wbwbwwbwbwbw多重复几遍就可以代替「无限长」。很快就写完了。然后交了三发罚时。后来发现我复制若干遍wbwbwwbwbwbw的时候......
  • AtCoder Beginner Contest 346
    A-AdjacentProduct(abc346A)题目大意给定\(n\)个数,依次输出相邻俩数的乘积。解题思路按照题意模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);c......
  • Atcoder ABC242H Random Painting
    对于这个\(\max\)似乎没有什么好的办法,考虑\(\min-\max\)反演。记\(t_i\)为第\(i\)格被染黑的时间,有\(E(\max(t_i))=\sum\limits_{S}(-1)^{|S|+1}E(\min(t_i))(i\inS)\)。考虑如果知道了\(S\),那么就可以知道\(c=\sum\limits_{i=1}^m[[l_j,r_j]\capS\no......
  • Atcoder ARC132E Paw
    考虑最后往左走往右走的覆盖情况。能发现肯定是有两个洞之间,或者是第一个洞左边,最后一个洞右边没有被覆盖,而左边的都被覆盖为向左,右边的都被覆盖为向右。大致证明就是考虑左边这一部分,如果有向右的,那么其右边的洞肯定都需要走过才行,不然会被覆盖,那么这样就可以一次性走出左边,就......
  • Atcoder ARC140D One to One
    考虑到对于\(n\)个点的连通块,那就有\(n\)条边,就是个基环树。如果这里面有\(1\)个\(-1\),那么就是\(n-1\)条边,就是一棵树。如果有\(2\)个\(-1\),\(n-2\)条边一定不连通,不可能出现。令\(-1\)的个数为\(c\)。那么先对于已知的边连上,如果一个连通块是基环树就直......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow(abc345A)题目大意给定一个字符串,问是不是形如<======...====>的字符串。解题思路根据长度构造出期望的字符串,再判断是否相等即可。神奇的代码s=input()print("Yes"ifs=="<"+"="*(len(s)-2)+">"else"No")B-Inte......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingldb=longdouble;#defineintlonglongusingvi=vector<int>;usingpii=pair<int,int>;constintmod=1e9+7;......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......
  • Atcoder ARC165D Xor Sum 5
    考虑到这个最终的答案是\(\oplus\),所以只需要考虑每种排列出现的次数的奇偶,如果为奇再计算贡献即可。考虑什么情况下出现次数为奇。令每个数出现的个数为\(c_{1\simn}\),方案数即为\(\dbinom{k}{c_1,c_2,\cdots,c_n}=\prod_{i=1}^n\dbinom{k-\sum\limits_{j=1}^{......