远征(expedition)

【题目描述】

寒枫将军将要带领他的部队去圣雪山消灭那里的冰龙。

部队分成了若干个小队,属于同一个小队的人兵种相同。寒枫将军有着杰出的指挥能力,在战斗的时候,寒枫将军能够让所有相同兵种的人互相配合,使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\n",ans);
36     return 0;
37 }

 大概敲了不到半个小时,可以接受。

posted @ 2017-02-13 08:56  J_william  阅读(572)  评论(0编辑  收藏  举报