贪心 + 排序
由于 1−10 十个数字只能出现 n/10 次,依次枚举 1−10的前 n/10个最小的代价
若某数的代价次数小于等于 n/10,必须全选,直接跳过
附C++,Java,Python3,JavaScript,Go代码
C++代码:(运行时间:648 ms,运行空间:944 KB)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
vector<vector<int>> s(10);
int n, a, b;
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> a >> b;
s[a].push_back(b);
}
for (int i = 0; i < 10; i ++)
sort(s[i].begin(), s[i].end());
LL res = 0, c = n / 10;
for (int i = 0; i < 10; i ++) {
if (s[i].size() <= c) continue;
for (int j = 0; j < s[i].size() - c; j ++)
res += s[i][j];
}
cout << res << endl;
return 0;
}
Java代码:(运行时间:4985 ms,运行空间:45572 KB)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer>[] s = new ArrayList[10];
Arrays.setAll(s, l -> new ArrayList<>());
for (int i = 0; i < n; i ++) {
int a = sc.nextInt(), b = sc.nextInt();
s[a].add(b);
}
for (int i = 0; i < 10; i ++) {
Collections.sort(s[i]);
}
int c = n / 10;
long res = 0;
for (int i = 0; i < 10; i ++) {
if (s[i].size() <= c) continue;
for (int j = 0; j < s[i].size() - c; j ++) {
res += s[i].get(j);
}
}
System.out.println(res);
}
}
Python3代码:(运行时间:2455 ms,运行空间:45636 KB)
n = int(input())
s = [[] for i in range(10)]
for i in range(n):
a, b = map(int, input().split())
s[a].append(b)
for i in range(10):
s[i].sort()
res, c = 0, n // 10
for i in range(10):
if len(s[i]) > c:
res += sum(s[i][:len(s[i]) - c])
print(res)
JavaScript代码:(运行时间:2200 ms,运行空间:32280 KB)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const s = Array.from({ length: 10 }, () => []);
let n;
rl.on('line', (input) => {
if (!n) {
n = Number(input.trim());
} else {
const [a, b] = input.trim().split(' ').map(Number);
s[a].push(b);
}
});
rl.on('close', () => {
for (let i = 0; i < 10; i ++) {
s[i].sort((a, b) => a - b);
}
let res = 0, c = Math.floor(n / 10);
for (let i = 0; i < 10; i ++) {
if (s[i].length <= c) continue;
for (let j = 0; j < s[i].length - c; j ++) {
res += s[i][j];
}
}
console.log(res);
});
Go代码:(运行时间:812 ms,运行空间:10464 KB)
package main
import (
. "fmt"
"bufio"
"os"
"sort"
)
const N int = 10
var (
in = bufio.NewReader(os.Stdin)
out = bufio.NewWriter(os.Stdout)
s = make([][] int, N)
n, a, b int
)
func main() {
defer out.Flush()
Fscan(in, &n)
for i := 0; i < n; i ++ {
Fscan(in, &a, &b)
s[a] = append(s[a], b)
}
for i := 0; i < 10; i ++ {
sort.Slice(s[i], func(x, y int) bool { return s[i][x] < s[i][y] })
}
res, c := 0, n / 10
for i := 0; i < 10; i ++ {
if len(s[i]) <= c {
continue
}
for j := 0; j < len(s[i]) - c; j ++ {
res += s[i][j]
}
}
Fprintln(out, res)
}
为什么我死活通过不了,明明代码差不多:#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#define LL long long
using namespace std;
int main(void){
int n;
cin>>n;
vector[HTML_REMOVED]> s(10);
int a,b;
for(int i=0;i<10;i){
cin>>a>>b;
s[a].push_back(b);
}
LL sum=0,c=n/10;
for (int i = 0; i < 10; i )
sort(s[i].begin(), s[i].end());
for(int i=0;i<10;i++){
if(s[i].size()<=c) continue; for(int j=0;j<s[i].size()-c;j++){ sum+=s[i][j]; } } cout<<sum<<endl; return 0;
}
orz orz