列表

详情


NC236734. 牛牛的聚会

描述

牛牛参加了牛妹的派对。
牛牛面前有一个圆桌,圆桌边缘按顺序摆上了 n 个蛋糕(第一个蛋糕和第 n 个蛋糕相邻)。
每个蛋糕都有一个饱腹值和奶油含量。
牛牛不喜欢吃奶油,所以他想要在保证自己能吃饱(所吃蛋糕的饱腹度的和大于等于 s)的情况下,所选择的蛋糕中奶油含量最大的那一个的奶油含量越低越好。我们知道,牛牛一直都是个绅士。所以他选择的蛋糕应该是相邻的(也就是对应圆上的一段弧(也可以是整个圆))。
现在它想请你帮它计算在能够吃饱的情况下,他吃到蛋糕中奶油含量最高的那一个最低会是多少?

输入描述

输入共三行。
第一行两个正整数 n, s
接下来的一行 n 个整数 a_1 ... a_n 代表第一个到第 n 个蛋糕每个蛋糕的饱腹值。
接下来的一行 n 个整数 b_1 ... b_n 代表第一个到第 n 个蛋糕每个蛋糕的奶油含量。
保证:

输出描述

输出共一行代表答案。
特别的,若牛牛吃掉所有蛋糕都无法吃饱则输出 -1 。

示例1

输入:

5 9
4 3 7 6 1
1 3 9 2 5

输出:

5

说明:

选择第 1,2,4,5 个蛋糕:
    饱腹值:4+3+6+1=14>9
    最大奶油含量:\max\{1,3,2,5\}=5
所以输出 5。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 1671ms, 内存消耗: 94820K, 提交时间: 2022-06-18 21:33:36

n,s=map(int,input().split())
x=list(map(int,input().split()))
y=list(map(int,input().split()))
if sum(x)<s:
    print(-1)
    exit(0)
my = max(y)
mx = y.index(my)
x = x[mx+1:]+x[:mx]
if sum(x)<s:
    print(my)
    exit(0)

def dfs(x,y):
    if(len(set(y))==1 or len(set(x))==1):return y[0]
    ps = y.index(max(y))
    x1=x[:ps]
    x2=x[ps+1:]
    s1,s2=sum(x1),sum(x2)
    if s1 < s and s2<s:
        return y[ps]
    if s1>=s:
        ans1=dfs(x1,y[:ps])
    else: ans1=1000000000
    if s2>=s:
        ans2=dfs(x2,y[ps+1:])
    else: ans2=1000000000
    return min(ans1,ans2)


print(dfs(x,y[mx+1:]+y[:mx]))

Python3 解法, 执行用时: 1203ms, 内存消耗: 55020K, 提交时间: 2022-06-19 21:06:00

def dfs(x,y):
    if(len(set(y))==1 or len(set(x))==1):return y[0]
    ps = y.index(max(y))
    x1=x[:ps]
    x2=x[ps+1:]
    s1,s2=sum(x1),sum(x2)
    if s1 < s and s2<s:
        return y[ps]
    if s1>=s:
        ans1=dfs(x1,y[:ps])
    else: ans1=0x7fffffff
    if s2>=s:
        ans2=dfs(x2,y[ps+1:])
    else: ans2=0x7fffffff
    return min(ans1,ans2)
 
n,s=map(int,input().split())
x=list(map(int,input().split()))
y=list(map(int,input().split()))
if sum(x)<s:
    print(-1)
    exit(0)
my = max(y)
mx = y.index(my)
x = x[mx+1:]+x[:mx]
if sum(x)<s:
    print(my)
    exit(0)
print(dfs(x,y[mx+1:]+y[:mx]))

C++ 解法, 执行用时: 212ms, 内存消耗: 6684K, 提交时间: 2022-06-19 09:51:31

#include<bits/stdc++.h>
using  namespace std;
#define ll long long 
const int N=2e5+100;
ll n,s,sum;
ll a[N*2],b[N*2];
bool check(ll mid){//二分答案
	ll ans=0;
	for(int i=1;i<=n*2;i++){
		if(b[i]<=mid){
			ans+=a[i];
			if(ans>=s)return 1;
		}
		else ans=0;
	}
	return 0;
}
int main(){
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
		sum+=a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		b[i+n]=b[i];
	}
	if(sum<s){
		cout<<-1;
		return 0;
	}
	ll l=1,r=1e9+10;
	while(l<r){
		ll mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	cout<<l;
	return 0;
}

上一题