列表

详情


NC223201. A深海少女

描述

现给定 n 个数 和 m 个关系。

第 i 个关系形如 (x, y)。请你重排 ,使得 最小。

你只需要输出这个最小值即可。

输入描述

一行两个数 

第二行,n 个数,表示

接下来 m 行,每行两个数

输出描述

一行一个数,表示答案。

示例1

输入:

3 3
3 3 2 
1 2
3 2
1 2

输出:

-2

原站题解

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

pypy3 解法, 执行用时: 375ms, 内存消耗: 38488K, 提交时间: 2021-09-17 20:10:13

n, m = map(int, input().split())
arr = list(map(int, input().split()))
cnt = [0] * n
for _ in range(m):
    x, y = map(int, input().split())
    x -= 1
    y -= 1
    cnt[x] += 1
    cnt[y] -= 1
# 贪心, cnt越大则该位置上的数需要越小
data = []
for i in range(n):
    data.append((cnt[i], i))
data.sort(key=lambda s: s[0], reverse=True)
arr.sort()
res = 0
for i in range(n):
    res += arr[i] * data[i][0]
print(res)

C++ 解法, 执行用时: 31ms, 内存消耗: 1272K, 提交时间: 2021-09-18 08:18:25

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],c[100005];
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),c[x]++,c[y]--;
	sort(a+1,a+1+n); sort(c+1,c+1+n);
	long long ans=0;
	for(int i=1;i<=n;i++) ans+=1ll*a[i]*c[n-i+1];
	cout<<ans<<endl;
}

上一题