题目链接:http://acm.tju.edu.cn/toj/showp2881.html
Time Limit: 3.0 Seconds Memory Limit: 65536K
Total Runs: 2321 Accepted Runs: 688 Multiple test files
But wait... How would that ranklist look like if it won't be possible to satisfy all the requests?
Suppose that we already have a ranklist. For each team, compute the distance between their preferred place and their place in the ranklist. The sum of these distances will be called the badness of this ranklist.
Problem specification
Given team names and their preferred placements find one ranklist with the minimal possible badness.Input
The first line of the input file contains an integer T specifying the number of test cases. Each test case is preceded by a blank line.Each test case looks as follows: The first line contains N - the number of teams participating in the competition. Each of the next N lines contains a team name (a string of letters and numbers) and its preferred place (an integer between 1 and N, inclusive). No two team names will be equal.
You can assume that N ≤ 100,000 and the length of the team name is no more than 20.
Output
For each of the test cases output a single line with a single integer - the badness of the best ranklist for the given teams.Sample Input
2 7 noobz 1 llamas 2 Winn3rz 2 5thwheel 1 NotoricCoders 5 StrangeCase 7 WhoKnows 7 3 ThreeHeadedMonkey 1 MoscowSUx13 1 NeedForSuccess 1
Sample Output
5 3
Hint: In the first test case, one possible ranklist with the minimal badness is:
1. noobz 2. llamas 3. Winn3rz 4. 5thwheel 5. NotoricCoders 6. WhoKnows 7. StrangeCaseIn the second test case all ranklists are equally good.
Source: TJU Team Selection Contest 2007 (4)
水题,sort,上代码:
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
struct Team{
char name[21];
int rank;
}team[100005];
bool cmp(Team a,Team b){
return a.rank<b.rank;
}
int main(){
int cast,n;
scanf("%d",&cast);
while(cast--){
scanf("%d",&n);
long long sum=0;
for(int i=1;i<=n;i++)
scanf("%s%d",team[i].name,&team[i].rank);
sort(team+1,team+n+1,cmp);
//cout<<team[1].name<<" "<<team[1].rank<<endl;
for(int i=1;i<=n;i++)
sum+=(team[i].rank>i?team[i].rank-i:i-team[i].rank);
printf("%lld\n",sum);
}
}