列表

详情


NC232000. A.《落花》&&《红衣集》

描述

在风景如画,美女如云的SMU生活学习一年后,多金的花样少年Joler练成了见女生必送鲜花的浪漫绝技。这一天,Joler要去见Princess Fun,他们在一条长度为n的,有个点的笔直的路上,Joler在第0点上,Princess Fun在第n点上,第1个点到第n-1个点上每个点都有一家花店,第i家花店以a_i的价格出售美丽值为b_i的花(每家花店都只出售一种花)。Joler希望送给Princess Fun最美丽的花,但他提前并不知道每家花店的花的美丽值。因此他想出了一个“货比三家”买花算法:

- 会买下第一家的花。

- 之后每遇到一家花店,就把当前这家花店的花和自己手里的花进行比较,如果这家花店的花比自己手里的花更美丽,就去下一家花店观察花店的美丽值(若存在)。简而言之,当前在第i个花店,会比较第i个花店售出花的美丽值,如果更美丽,就去看第个花店售出花的美丽值。买下这两家花店中最美丽的花(如果一样美丽,则买下便宜的一家花店的花)来替换自己手中的花并且下一次从第家花店开始看,继续以上步骤。

请你计算出Joler最终需要花多少钱。

输入描述

共3行:
第一行包含一个整数n(2 n 100000), 表示路的长度(路上有个点)。
第二行包含n-1个整数,表示第i家花店出售花的价格。
第三行包含n-1个整数,表示第i家花店出售的花的美丽值。

输出描述

共一行,输出按照题面中的方法,Joler最终会花多少钱。

示例1

输入:

5
1 3 2 5
2 3 4 1

输出:

3

原站题解

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

Python3 解法, 执行用时: 107ms, 内存消耗: 20992K, 提交时间: 2021-12-26 14:22:50

n = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
s = A[0]    # 花费的钱
hFlower = B[0] # 当前花的美丽值
i = 1
while i + 1 < n:
    if B[i] > hFlower:
        if (i + 2 < n) and (B[i + 1] > B[i] or (B[i + 1] == B[i] and A[i + 1] < A[i])):
            s += A[i + 1]
            hFlower = B[i + 1]
        else:
            s += A[i]
            hFlower = B[i]
        i += 1
    i += 1
print(s)

C 解法, 执行用时: 31ms, 内存消耗: 1912K, 提交时间: 2021-12-26 23:44:49

#include<stdio.h>
int main()
{long a[100000]={0},b,c[100000]={0},i,d,e,sum=0;
scanf("%d",&b);
for(i=1;i<b;i++)
scanf("%ld",&c[i]);
for(i=1;i<b;i++)
scanf("%ld",&a[i]);
for(i=2,d=a[1],e=c[1];i<b;)
{if(a[i]>d)
{if(a[i]>a[i+1])
d=a[i],e=c[i];
else if(a[i]<a[i+1])
d=a[i+1],e=c[i+1];
else if(a[i]==a[i+1])
{if (c[i]>c[i+1])
d=a[i+1],e=c[i+1];
else
d=a[i],e=c[i];}
i+=2,sum+=e;
}
 else i++;
}
printf("%ld",sum+c[1]);
}

C++ 解法, 执行用时: 72ms, 内存消耗: 1272K, 提交时间: 2021-12-26 19:27:17

#include<bits/stdc++.h>
using namespace std;
int a[100001];
int b[100001];
int main()
{
	int n,i,j=1;
	long long sum=0;
	cin>>n;
	for(i=1;i<n;i++ )
		cin>>a[i];
	for(i=1;i<n;i++)
		cin>>b[i];
	sum=a[1];
	for(i=2;i<n;i++)
	{
		if(b[i]<=b[j])	continue;
		if(i+1==n)	sum+=a[i];
		else
		{
			if(b[i]==b[i+1]) j=a[i]<a[i+1]?i:i+1;
			else j=b[i]>b[i+1]?i:i+1;
			sum+=a[j];
			i++;
		}
	}
	cout<<sum<<endl;
}

上一题