zoukankan      html  css  js  c++  java
  • 【PAT甲级】1034 Head of a Gang (30 分)

    题意:

    输入两个正整数N和K(<=1000),接下来输入N行数据,每行包括两个人由三个大写字母组成的ID,以及两人通话的时间。输出团伙的个数(相互间通过电话的人数>=3),以及按照字典序输出团伙老大的ID和团伙的人数(团伙中通话时长最长的人视为老大,数据保证一个团伙仅有一名老大)。

    AAAAAccepted code:

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 string s,s2;
     5 int x[1007],y[1007];
     6 vector<pair<int,int> >edge[20007];
     7 bool vis[20007];
     8 int val[20007];
     9 int mx=0;
    10 int pos=0;
    11 int ans[20007];
    12 int num[20007];
    13 int cnt=0;
    14 int c[1007];
    15 bool visedge[1007];
    16 int sum2=0;
    17 void dfs(int x){
    18     if(!vis[x])
    19         ++cnt;
    20     vis[x]=1;
    21     for(auto it:edge[x]){
    22         if(visedge[it.second])
    23             continue;
    24         visedge[it.second]=1;
    25         if(!vis[it.first]){
    26             ++cnt;
    27             vis[it.first]=1;
    28         }
    29         val[x]+=c[it.second];
    30         val[it.first]+=c[it.second];
    31         sum2+=c[it.second];
    32         if(val[x]>mx){
    33             mx=val[x];
    34             pos=x;
    35         }
    36         dfs(it.first);
    37     }
    38 }
    39 int main(){
    40     int n,k;
    41     cin>>n>>k;
    42     for(int i=1;i<=n;++i){
    43         cin>>s>>s2>>c[i];
    44         x[i]=(s[0]-'A')*26*26+(s[1]-'A')*26+s[2]-'A';
    45         y[i]=(s2[0]-'A')*26*26+(s2[1]-'A')*26+s2[2]-'A';
    46         edge[x[i]].push_back({y[i],i});
    47         edge[y[i]].push_back({x[i],i});
    48     }
    49     int sum=0;
    50     for(int i=1;i<=n;++i){
    51         sum2=0;
    52         mx=0;
    53         pos=0;
    54         cnt=0;
    55         if(!vis[x[i]])
    56             dfs(x[i]);
    57         if(cnt>2&&sum2>k){
    58             ans[pos]=sum2;
    59             num[pos]=cnt;
    60             ++sum;
    61         }
    62     }
    63     cout<<sum<<"
    ";
    64     for(int i=0;i<26*26*26;++i)
    65         if(ans[i]){
    66             char alp[3];
    67             int tmp=i;
    68             alp[0]=tmp/26/26;
    69             tmp%=26*26;
    70             alp[1]=tmp/26;
    71             tmp%=26;
    72             alp[2]=tmp;
    73             for(int j=0;j<=2;++j){
    74                 alp[j]+='A';
    75                 cout<<alp[j];
    76             }
    77             cout<<" "<<num[i]<<"
    ";
    78         }
    79     return 0;
    80 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11521016.html
Copyright © 2011-2022 走看看