首页 > 试题广场 >

挖掘机技术哪家强(20)

[编程题]挖掘机技术哪家强(20)
  • 热度指数:19829 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入描述:
输入在第1行给出不超过105的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号、及其比赛成绩(百分制),中间以空格分隔。


输出描述:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
示例1

输入

6<br/>3 65<br/>2 80<br/>1 100<br/>2 70<br/>3 40<br/>3 0

输出

2 150

python,使用defaultdict,特别适合。

from collections import defaultdict

a, dd = int(input()), defaultdict(int)
for i in range(a):
    a, b = map(int, input().split())
    dd[a] += b
result = max(dd.items(), key=lambda c: c[1])
print(str(result[0]) + " " + str(result[1]))
发表于 2017-10-13 08:12:46 回复(0)
这个测试用例是不是错了?不是说学校连续编号么?

发表于 2016-11-12 23:22:16 回复(6)
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

/**
 * 挖掘机技术哪家强
 * 题目描述
 * 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强
 * 的那个学校。
 * 输入描述:
 * 输入在第1行给出不超过105的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所
 * 代表的学校的编号(从1开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
 * 输出描述:
 * 在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
 * 输入例子:
 * 6
 * 3 65
 * 2 80
 * 1 100
 * 2 70
 * 3 40
 * 3 0
 * 输出例子:
 * 2 150
 *
 * @author shijiacheng
 * @date 2018/1/29
 */
public class B1022TheBestSchool {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < N; i++) {
            int key = sc.nextInt();
            int value = sc.nextInt();
            int score = 0;
            if (map.containsKey(key)) {
                score += map.get(key) + value;
            } else {
                score = value;
            }
            map.put(key, score);
        }

        Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
        int value = -1;
        int key = -1;
        while (entries.hasNext()) {

            Map.Entry<Integer, Integer> entry = entries.next();
            if (entry.getValue() > value) {
                value = entry.getValue();
                key = entry.getKey();
            }
        }
        System.out.println(key + " " + value);
    }
}
发表于 2018-01-29 19:33:13 回复(0)
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
    int N; cin >> N;
    vector<int> vec(N,0);
    map<int, int> map_count;
    for(int i =0; i<N; i++){
        int val1,val2;
        cin >> val1 >> val2;
        map<int,int>::iterator it = map_count.find(val1);
        if(it == map_count.end())                  
        map_count.insert(pair<int,int>
  (val1,val2));
        else
            map_count[val1] += val2;
    }
    map<int,int>::iterator it = map_count.begin();
    int number = 0,max = 0;
    for(; it!= map_count.end(); it++)
        if(it->second > max){
        number = it->first;
        max = it->second;
    }
    cout << number << ' ' << max << endl;
    return 0;
}

发表于 2015-08-13 20:18:23 回复(0)
#include<iostream>
using namespace std;
int n,a,b,score[100001]={0},maxnum,maxscore=0;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a>>b;
		score[a]+=b;//将分数加到编号为a的学校的总分里
		if(score[a]>maxscore)
		{
			maxnum=a;//当前分数最大的学校编号
			maxscore=score[a];//当前的最大总分
		}
	}
	cout<<maxnum<<' '<<maxscore<<endl;
	return 0;
}
思路:创建一个数组记录总分,下标表示学校编号。每输入一次,就把分数加到对应的数组元素中,并且一边更新最大总分值和对应的学校编号。

书写中途突然想到的,感觉算法效率快很多。发现评论区好多都是这种思路,仅供参考!
编辑于 2020-04-16 13:27:03 回复(0)
#Python保存为字典就好,然后使用字典的值进行排序
while True:
    try:
        num = int(input())
        markDict = dict()
        for i in range(num):
            temp = input().split()
            if temp[0] not in markDict:     #学校编号不在字典中,创建一个
                markDict[temp[0]] = int(temp[1])    
            else:
                markDict[temp[0]] += int(temp[1])   #如果该学校编号已经存在,把成绩加进去
        result = sorted(markDict.items(),key=lambda x:x[1])
        print("%s %d" % result[-1])
    except Exception:
        break

编辑于 2018-09-22 11:04:45 回复(0)
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Map.Entry;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            Map<Integer,Integer> map = new TreeMap<>();
            int n = sc.nextInt();
            for(int i =0;i<n;i++){
                int key = sc.nextInt();
                int value = sc.nextInt();
                if(map.containsKey(key)){
                    map.put(key,map.get(key)+value);
                }else{
                    map.put(key,value);
                }
            }
            List<Map.Entry<Integer,Integer>> lt = new ArrayList(map.entrySet());
            Collections.sort(lt,new Comparator<Map.Entry<Integer,Integer>>(){
                public int compare(Entry<Integer,Integer> cp1,Entry<Integer,Integer> cp2){
                    if(cp1.getValue() > cp2.getValue()){
                        return -1;
                    }
                    return 1;
                }
            });
            System.out.println(lt.get(0).getKey()+" "+lt.get(0).getValue());
        }
    }
}

发表于 2018-09-30 16:58:36 回复(0)
只要一个循环就够了
#include<iostream>
using namespace std;
const int maxn=10e5+1;
int s[maxn]={0};
int main() {
	int N,max=0,maxi=0,i,score;
	cin>>N;
	while(N--){
		cin>>i>>score;
		s[i]+=score;
		if(s[i]>max){
			max=s[i];
			maxi=i;
		}
	}
	cout<<maxi<<" "<<max;
    return 0;
}


发表于 2020-01-30 15:27:47 回复(0)
把输入的编号和成绩以K V 对的形式放入HashMap中,若K已经存在就把成绩累加到K对于的V上,否则就放入一个K V对,同时比较除最大成绩
import java.util.*;

public class Main{
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int a = 0,b = 0, id = 0, max = 0;
        int n = sc.nextInt();
        HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();
        for(int i = 0; i < n ; i++){
            a = sc.nextInt();
            b = sc. nextInt();
            if(map.containsKey(a))
               b = map.get(a) + b;
        	map.put(a, b);
        	if(max < b){
        		max = b;
        		id = a;
        	}
        }
        System.out.println(id + " " +max);
    }
}


发表于 2019-08-19 18:16:38 回复(0)
import java.util.*;
public class Main{
    public static void main(String []args){
        Scanner in=new Scanner(System.in);
        int N=in.nextInt();
        int Score[]=new int[100001]; 
        int max=0;
        int index=0;
        for(int i=0;i<N;i++){
            int n=in.nextInt();
            Score[n]+=in.nextInt();
            if(Score[n]>max){
                max=Score[n];
                index=n;
            }
        }
       System.out.println(index+" "+max);
    }
}

编辑于 2019-05-08 15:47:27 回复(0)
import java.util.*;

public class Main{
    public static void main(String... args){
        try(Scanner in = new Scanner(System.in)){
            int n = in.nextInt(); //表示组数
            Map<Integer,Integer> map = new HashMap<>();
            for(int i = 0; i < n; i++){
                int key = in.nextInt();
                int val = in.nextInt();
                Integer cnt = map.get(key) ; //记录每个学校的技术分数
                if(cnt == null){
                    map.put(key,val);
                }else{
                    map.put(key,cnt + val);
                }
            }
            int key = 0;//记录最大的key
            int val = Integer.MIN_VALUE;
            for(Map.Entry<Integer,Integer> kv:map.entrySet()){
                if(kv.getValue() > val){
                    key = kv.getKey();
                    val = kv.getValue();
                }
            }
            System.out.println(key +" "+ val);
        }
    }
}

发表于 2019-05-05 14:26:06 回复(0)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int score[N];
int main(){
    int n,a,b,resid = 0;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        scanf("%d%d",&a,&b);
        score[a] += b ;
        if(score[a]>score[resid]) resid = a;
    }
    printf("%d %d\n",resid,score[resid]);
    return 0;
}

发表于 2019-04-02 09:44:54 回复(0)
#include <iostream>
using namespace std;

int main(){
    int n,i;
    cin>>n;
    int id[n],score[n];
    int id_max=0;
    int sum[100001];//sum[0]为暂存标记
    for(i=0;i<100001;i++){
        sum[i]=0;
    }
    for(i=0;i<n;i++){
        cin>>id[i]>>score[i];
        sum[id[i]]+=score[i];
        if(sum[id[i]]>sum[0]){
            sum[0]=sum[id[i]];
            id_max=id[i];
        }
    }
    cout<<id_max<<" "<<sum[0];
    return 0;
}

发表于 2019-02-01 14:55:34 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int a[100000],i,j,m,n,x,y,max=0,t;
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        a[x]+=y;
        if(max<=a[x])
        {
        max=a[x];
        t=x;}
    }
    printf("%d %d\n",t,max);
    return 0;
}

编辑于 2018-05-23 21:10:27 回复(0)
//想问下pat最后一个测试点为什么会超时
#include<stdio.h>
#include<stdlib.h>
int main() {
    int school[10000] = { 0 }, score[10000], count,temp1,temp2,max,sch,i,t;
    scanf("%d", &count);
    for (i = 0; i < count; i++) {
        scanf(" %d %d", &temp1, &temp2);
        for (t = 0; t < 10000; t++) {
            if (school[t] == temp1) {
                score[t] = score[t] + temp2;
                break;
            }
            if (school[t] == 0) {
                school[t] = temp1;
                score[t] = temp2;
                break;
            }
        }
    }
    max = score[0];
    sch = school[0];
    for (i = 0; i < count; i++) {
        if (school[i] == 0) {
            printf("%d %d", sch, max);
            return 0;;
        }
        if (score[i] > max) {
                max = score[i];
                sch = school[i];
        }        
    }
    printf("%d %d", sch, max);
    return 0;
}//想问下pat最后一个测试点为什么会超时....从java过来的

编辑于 2018-03-05 22:33:16 回复(0)
#include<iostream>
#include<string.h>
using namespace std;

int main(){
    int N;
    int max=0,id=0;
    int num[100000],temp=0,grade;
    memset(num,0,sizeof(num));
    cin>>N;
    for(int i=0;i<N;++i){
        cin>>temp>>grade;
        num[temp]+=grade;
        if(num[temp]>max){
            max=num[temp];
            id=temp;
        }
    }
    cout<<id<<" "<<max<<endl;
    return 0;
}

发表于 2018-03-03 14:33:16 回复(0)
#include<iostream>
using namespace std;
 
int main(){
    int N,i,max=0,d;
    cin>>N;
    int *a=new int[N];
    int *b=new int[N];
    int c[100000]={0};
    for(i=0;i<N;i++){
        cin>>a[i];
        cin>>b[i];
    }
    for(i=0;i<N;i++){
        c[a[i]]=c[a[i]]+b[i];
    }
    for(i=0;i<N;i++){
        if(c[a[i]]>max)max=c[a[i]];
    }
    for(i=0;i<N;i++){
        if(c[a[i]]==max)d=a[i];
    }
    cout<<d<<" "<<max;
    delete[] a;
    delete[] b;
    return 0;
}

编辑于 2017-11-23 00:03:41 回复(0)
//PAT官网的时间限制是200ms,这种方法在官网有测试点超时,有改进想法的同学欢迎私信告诉我。
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] school = new int[100010];
		int maxid=0,maxscore=0;
		Arrays.fill(school, 0);
		for (int i = 0; i < N; i++) {
			int id=in.nextInt();
			int score=in.nextInt();
			school[id] += score;
			if (school[id]>maxscore) {
				maxid=id;
				maxscore=school[id];
			}
			
		}
		
		System.out.println(maxid + " " + maxscore);
		in.close();
		
	}

}

发表于 2016-10-28 10:39:36 回复(5)
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) {
        Scanner in = new Scanner(System.in); int[] player = new int[100005];
        Arrays.fill(player,0); int N = in.nextInt(); for(int i = 0;i<N;i++){
            player[in.nextInt()] += in.nextInt();
        } int max = 0,id = 0; for(int i = 0;i<100005;i++){ if(player[i]>max){
                max = player[i];
                id = i;
            }
        }
        System.out.println(id+" "+player[id]);
    }
}
发表于 2016-08-01 00:32:29 回复(0)
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int,int> a;
int n;
int num,score;
map<int, int>::iterator iter;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num>>score;
iter=a.find(num);
if(iter!=a.end())
{
iter->second=iter->second+score;
}
else
{
a.insert(pair<int, int>(num,score));
}
}
int maxn=0,maxs=0;
for(iter=a.begin();iter!=a.end();++iter)
{
if((iter->second)>maxs)
{
maxn=iter->first;
maxs=iter->second;
}
}
cout<<maxn<<" "<<maxs<<endl;
}

发表于 2015-12-17 21:56:59 回复(0)