• 远征(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
    ",ans);
    36     return 0;
    37 }

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

  • 相关阅读:
    Muduo 网络编程示例之五: 测量两台机器的网络延迟
    “过家家”版的移动离线计费系统实现
    一种自动反射消息类型的 Google Protobuf 网络传输方案
    Muduo 设计与实现之一:Buffer 类的设计
    为什么 muduo 的 shutdown() 没有直接关闭 TCP 连接?
    Muduo 网络编程示例之八:用 Timing wheel 踢掉空闲连接
    C++ 工程实践(5):避免使用虚函数作为库的接口
    分布式系统中的进程标识
    Ormlite在一般java环境中操作Sqlite
    android游戏开发框架libgdx的使用(十八)—简单的AVG游戏效果实现
  • 原文地址:https://www.cnblogs.com/J-william/p/6392421.html
Copyright © 2020-2023  润新知