【题目描述】
寒枫将军将要带领他的部队去圣雪山消灭那里的冰龙。
部队分成了若干个小队,属于同一个小队的人兵种相同。寒枫将军有着杰出的指挥能力,在战斗的时候,寒枫将军能够让所有相同兵种的人互相配合,使t个相同兵种的人发挥出t2的战斗力;寒枫将军还能让不同兵种的人互相配合,使整个部队的战斗力是所有兵种战斗力的和。
例如,部队中有3个小队,分别是5个人的步兵小队,3个人的步兵小队,3个人的骑兵小队。那么步兵战斗力为64,骑兵战斗力为9,部队总战斗力为73。
寒枫将军需要知道他的部队的战斗力是多少。
【输入格式】
第一行一个整数n,表示小队数。接下来n行,第i行有两个整数ai、bi,表示这个小队有ai个人,兵种为bi。
【输出格式】
一行一个整数,部队的战斗力。
【样例输入】
3
5 1
3 1
3 2
【样例输出】
73
【数据规模与约定】
10%的数据,n=1
30%的数据,n≤1000
另有20%的数据,ai=1
另有30%的数据,bi≤1000
100%的数据,1≤n≤100000,1≤ai≤10000,1≤bi≤1,000,000,000
直接用map做就可以。
题解:是以b为关键字排序,然后捋一遍求出答案。时间复杂度(O(nlogn))
代码实现:
我的:
1 #include<map> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 int n,l,s[100010],b; 6 long long a,ans; 7 map <int,long long> v; 8 int main(){ 9 freopen("expedition.in","r",stdin); 10 freopen("expedition.out","w",stdout); 11 cin>>n; 12 for(int i=0;i<n;i++){ 13 cin>>a>>b; 14 if(!v[b]) s[l++]=b; 15 v[b]+=a; 16 } 17 for(int i=0;i<l;i++) ans+=v[s[i]]*v[s[i]]; 18 cout<<ans<<endl; 19 return 0; 20 }
std:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N = 100500; 5 int n; 6 struct Info 7 { 8 int num,kind; 9 }xu[N]; 10 bool cmp(Info x,Info y) 11 { 12 return(x.kind<y.kind); 13 } 14 int main() 15 { 16 freopen("expedition.in","r",stdin); 17 freopen("expedition.out","w",stdout); 18 int i; 19 scanf("%d",&n); 20 for(i=1;i<=n;i++) 21 scanf("%d%d",&xu[i].num,&xu[i].kind); 22 sort(xu+1,xu+n+1,cmp); 23 long long ans=0; 24 for(i=1;i<=n;i++) 25 { 26 long long now=xu[i].num; 27 while(i<n && xu[i].kind==xu[i+1].kind) 28 { 29 i++; 30 now+=xu[i].num; 31 } 32 now*=now; 33 ans+=now; 34 } 35 printf("%I64d ",ans); 36 return 0; 37 }
大概敲了不到半个小时,可以接受。