AcWing 蓝桥杯集训·每日一题2025
题目链接 : 5437. 拐杖糖盛宴
题意: 有m个不同的糖果和n个不同高度的奶龙, 奶龙可以根据自己的身高去吃糖果,糖果垂直于地面,对于一个糖果都需要让每个奶龙尝试能否吃到,如果吃到则减去相应吃到的长度, 奶龙长高吃掉糖果的长度即可,根据长度进行判断, 分类讨论。
解题思路 :
根据糖果个数遍历, 外层遍历糖果, 内层遍历奶龙, 创建一个临时变量去记录每一层糖果目前已经吃掉的高度
如果 已经吃掉的糖果大于等于我们糖果的高度这代表糖果已经吃完, 我们更换下一个糖果, 如果当前奶龙的身高高于糖果的长度, 则比较,当前奶龙的身高能否够着现在糖果的高度
(1) 如果可以则当前奶龙身高加上他吃掉糖果的长度, 如果够不着则换下一个奶龙, 如果奶龙身高高于糖果的长度, 则奶龙吃掉目前糖果所剩所有长度
AC Code
// Problem: 拐杖糖盛宴
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/description/5440/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
typedef long long ll; // 确保 ll 在使用前被定义
using namespace std;
using i64 = long long;
#define f for(int i = 0; i < n;++i)
#define ff for(int i = 1; i <= n;++i)
#define int long long
#define In ll n; std::cin >> n;
const int mod = 1e9 + 7, N = 1e7;
void solve(){
int n, m ;std::cin >> n >> m;
std::vector<int> a(n), b(m);
f std::cin >> a[i];
for(int i = 0 ; i < m; i++) std::cin >> b[i];
for(int i = 0; i < m; i++) {
int tmp = 0;
for(int j = 0; j < n; j++) {
if(tmp >= b[i]) {
break;
}
if(a[j] <= b[i]) {
if(a[j] > tmp) {
int x = a[j];
a[j] += (a[j] - tmp);
tmp = std::max(tmp, x);
} else continue;
} else {
a[j] += (b[i] - tmp);
break;
}
}
}
f std::cout << a[i] << "\n";
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0); std::cout.tie(0);
ll T = 1;
//std::cin >> T;
for(int i = 1; i <= T; ++i) solve();
}
Java
import java.util.*;
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st=new StringTokenizer(bf.readLine());
int n=Integer.parseInt(st.nextToken()),m=Integer.parseInt(st.nextToken());
long a[]=new long[n];
st=new StringTokenizer(bf.readLine());
for(int j=0;j<n;j++){
a[j]=Integer.parseInt(st.nextToken());
}
st=new StringTokenizer(bf.readLine());
for(int j=0;j<m;j++){
int b=Integer.parseInt(st.nextToken());
if(b<=a[0]){
a[0]+=b;
}
else{
int low=0;
for(int i=0;i<n;i++){
if(a[i]>=low){
long high=Math.min(a[i],b);//最高能吃到的高度
a[i]+=high-low;
low+=high-low;
}
}
}
}
for(long p:a){
bw.write(p+"\n");
}
bw.flush();
}
}
Python3
n,m=map(int,input().split())
a,b=list(map(int,input().split())),list(map(int,input().split()))
for i in range(0, m):
tmp = 0
for j in range(0, n):
if tmp >= b[i]:
break;
if a[j] <= b[i]:
if a[j] > tmp:
x = a[j]
a[j] += (a[j] - tmp)
if x > tmp:
tmp = x
else:
a[j] += (b[i] - tmp)
break
for i in range(0, n):
print(a[i])