列表

详情


NC26158. I. 大吉大利

描述

有 n 个人,编号为 1 ~ n,第 i 个人有 a[i] 枚金币,若第一个人金币数大于 0,则可以选择一个  然后,弃置 1 枚金币,让第 i 个人弃置 b[i] 枚金币,若第 i 个人金币数少于 b[i] 则弃置所有金币。现需要让第 1 个⼈人弃置最少的⾦金金币,成为唯⼀的金币数最多的人。

输入描述

第一行一个正整数 ,第二行 n 个正整数 ,第三行,n-1 个正整数,第 i 个表示 

输出描述

输入自己需要弃置的最少金币,如果无解输出 -1。

示例1

输入:

3
3 2 1
1 1

输出:

0

示例2

输入:

3
3 3 3
3 3

输出:

2

示例3

输入:

2
3 10
5

输出:

2

原站题解

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

C++ 解法, 执行用时: 55ms, 内存消耗: 1964K, 提交时间: 2021-10-22 15:10:10

#include<iostream>
#define ll long long
using namespace std;
const ll N=5e5+5;
ll a[N],b[N];
ll n,k=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=2;i<=n;i++) cin>>b[i];
	for(int i=2;i<=n;i++){
		if(a[i]>=a[1]&&a[1]) {
			a[i]-=a[1];
			int m=a[i]/b[i]+1;
			k+=m;
			a[1]-=m;
		}
	}
	if(a[1]<=0) cout<<-1<<endl;
	else
	cout<<k<<endl;
}

Python3 解法, 执行用时: 151ms, 内存消耗: 21680K, 提交时间: 2021-07-25 18:29:50

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
ans=0
if a[0]<0:
    print(-1)
else:
    for i in range(1,len(a)):
        if a[i]>=a[0] and a[0]>0:
            a[i]-=a[0]
            m=int(a[i]/b[i-1]+1)
            ans+=m
            a[0]-=m
if a[0]>0:
    print(ans)
else:
    print(-1)

上一题