PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting victims lose their entire life savings. To stop this crime, you are supposed to write a program to detect those suspects from a huge amount of phone call records.

A person must be detected as a suspect if he/she makes more than K short phone calls to different people everyday, but no more than 20% of these people would call back. And more, if two suspects are calling each other, we say they might belong to the same gang. A makes a short phone call to B means that the total duration of the calls from A to B is no more than 5 minutes.

Input Specification:
Each input file contains one test case. For each case, the first line gives 3 positive integers K (≤500, the threshold(阈值) of the amount of short phone calls), N (≤103 10^310
3
?? )?? , the number of different phone numbers), and M (≤105 10^510
5
?? )?? , the number of phone call records). Then M lines of one day’s records are given, each in the format:

caller receiver duration
where caller and receiver are numbered from 1 to N, and duration is no more than 1440 minutes in a day.

Output Specification:
Print in each line all the detected suspects in a gang, in ascending order of their numbers. The gangs are printed in ascending order of their first members. The numbers in a line must be separated by exactly 1 space, and there must be no extra space at the beginning or the end of the line.

If no one is detected, output None instead.

Sample Input 1:
5 15 31
1 4 2
1 5 2
1 5 4
1 7 5
1 8 3
1 9 1
1 6 5
1 15 2
1 15 5
3 2 2
3 5 15
3 13 1
3 12 1
3 14 1
3 10 2
3 11 5
5 2 1
5 3 10
5 1 1
5 7 2
5 6 1
5 13 4
5 15 1
11 10 5
12 14 1
6 1 1
6 9 2
6 10 5
6 11 2
6 12 1
6 13 1
Sample Output 1:
3 5
6
Note: In sample 1, although 1 had 9 records, but there were 7 distinct receivers, among which 5 and 15 both had conversations lasted more than 5 minutes in total. Hence 1 had made 5 short phone calls and didn’t exceed the threshold 5, and therefore is not a suspect.

Sample Input 2:
5 7 8
1 2 1
1 3 1
1 4 1
1 5 1
1 6 1
1 7 1
2 1 1
3 1 1
Sample Output 2:
None

【声明】

  由于此题还未上PAT官网题库,故没有测试集,仅仅是通过了样例,若发现错误,感谢留言指正。

Solution:  

  判断电话诈骗分子,当一个人与>k个不同的人打短时间【<= 5分钟】通话,且这些人中只有不超过20%的人给回了电话,那么这个人就是诈骗犯;

  当相互有通话的诈骗犯是认为同一组;

  输出按组内升序,组间按第一个组员升序的格式输出。 

  使用邻接矩阵记录通过时间【累计通话时间】,然后分别记录每个人满足要求的打出的电话人数以及回电话的人数,最后将相互通话的嫌疑犯视为一组。

  注重细节哦。

  

 1 #include <iostream>
 2 #include <vector>
 3 #include <map>
 4 using namespace std;
 5 int main()
 6 {
 7     int k, n, m, t;
 8     cin >> k >> n >> m;
 9     vector<int>call(n + 1, 0), back(n + 1, 0);//短电话打出去的记录和这些人打回进来的记录
10     vector<vector<int>>v(n + 1, vector<int>(n + 1, 0));//电话记录,记住记录的是累计的通话时间
11     while (m--)
12     {
13         int a, b, c;
14         cin >> a >> b >> c;
15         v[a][b] += c;//算累加通话时间的
16     }
17     for (int i =1; i <= n; ++i)
18     {
19         for (int j = 1; j <= n; ++j)
20         {
21             if (v[i][j]>0 && v[i][j] <= 5)//这通话时间算是短电话
22             {
23                 ++call[i];//计算i打出去的人数
24                 if (v[j][i] > 0)//这是j回给了i的
25                     ++back[i];//计算回给i的人数
26             }
27         }
28     }
29     vector<int>suspect, team(n + 1, 0);//统计诈骗犯的人数和初始化他们的团队号
30     for (int i = 1; i <= n; ++i)
31     {
32         if (call[i] > k && call[i] >= back[i]*5)//打出去的人数大于阈值k,回电话的人数不多于打出去的20%,注意
33         {
34             team[i] = i;//用来算同谋的
35             suspect.push_back(i);
36         }
37     }
38     for (int i = 0; i < suspect.size(); ++i)//这里虽然是双重循环,但是诈骗犯的数量级很小的,所以这里应该不会超时间的,当然,超了的话,就用DFS即可
39         for (int j = i + 1; j < suspect.size(); ++j)
40             if (v[suspect[i]][suspect[j]] > 0 && v[suspect[j]][suspect[i]] > 0)//这两个诈骗人相互打过电话
41                 team[suspect[j]] = team[suspect[i]];
42     map<int, vector<int>>res;
43     for (int i = 1; i <= n; ++i)
44         if (team[i] > 0)
45             res[team[i]].push_back(i);//将属于同一伙的诈骗犯放一组
46     if (suspect.size() == 0)
47         printf("None");
48     else
49     {
50         for (auto ptr = res.begin(); ptr != res.end(); ++ptr)
51         {
52             for (int i = 0; i < ptr->second.size(); ++i)//由于遍历是从小到大的,所以不用排序
53                 printf("%s%d", i == 0 ? "" : " ", ptr->second[i]);
54             printf("\n");
55         }
56     }
57     return 0;
58 }

原文地址:https://www.cnblogs.com/zzw1024/p/11954289.html

时间: 2024-11-07 10:44:30

PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】的相关文章

PAT甲级题解-1097. Deduplication on a Linked List (25)-链表的删除操作

给定一个链表,你需要删除那些绝对值相同的节点,对于每个绝对值K,仅保留第一个出现的节点.删除的节点会保留在另一条链表上.简单来说就是去重,去掉绝对值相同的那些.先输出删除后的链表,再输出删除了的链表. 建立结构体节点,包括起始地址addr,下一个地址to,值value.链表数组索引为地址,接下来就是模拟链表的操作了,并且建立一个flag数组标记对应值K是否出现,若出现则flag[k]=addr,未出现则为-1,注意这里不能为0因为地址值存在为0的情况.最后的输出地址前面要补0,如果是链尾的话,-

【PAT甲级】1079 Total Sales of Supply Chain (25 分)

题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结点接着输入一个整数表示该零售商进货的数量,X不为零则接着输入X个正整数表示它的下级经销商是哪些结点.输出所有零售商进货的总价.(结点从0~N-1,0为根节点即供应商) 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using name

【PAT甲级】1097 Deduplication on a Linked List (25 分)

题意: 输入一个地址和一个正整数N(<=100000),接着输入N行每行包括一个五位数的地址和一个结点的值以及下一个结点的地址.输出除去具有相同绝对值的结点的链表以及被除去的链表(由被除去的结点组成的链表). AAAAAccepted code: 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int nex[100007],val[100007]; 5 vector<

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.

西安活动 | 2019年1月13号 &quot;拥抱开源, 又见.NET&quot; 线下交流活动报名进行中

随着.NET Core的发布和开源,.NET又重新回到人们的视野..NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps和Microservice的最佳实践已经在.NET Core落地,比如 Ocelot网关.Grpc+Consul 服务注册发现.Apworks CQRS实现.Xigadee 微服务工具库.脚手架. 西安.NET社区组织发起了此次“拥抱变化, 又见.NET”线下交流活动,邀请了三位资深.NET开发者作为分享讲师,他们将从架构.原理.语言

2019年2月26日【整理物品,下载收集考研资料,明天正式开始复习】

2019年1月26日星期六 一:一句话木马重学习 1.网站安全狗网马查杀 http://download.safedog.cn/download/software/safedogwzApache.exe 2.D盾 Web 查杀 http://www.d99net.net/down/WebShellKill_V2.0.9.zip 3 深信服WebShellKillerTool http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip 4 BugSc

java 手机号正则表达式 2019年1月

  import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; /**  * @author wucai  *三大运营商号码均可验证(不含卫星通信1349)  */ public class mobile {     /*  <br> 2019年1月16日已知     中国电信号段         133,149,153,173,174,

当今最全面可用的微博分享组件嵌入方法(亲测2019年2月仍有效)

当今最全面可用的微博分享组件嵌入方法(亲测2019年2月仍有效) 最近一直在找一种目前可用的微博分享组件的使用方法,发现有3个大坑: 向网页嵌入微博秀时,需要的uid简单,但需要的verifier值有点难获取,原因在于原生成微博秀页面的 url 及其子链接均会被强制从http重定向跳转到https,此外其response中部分css引用失败导致页面无法完整显示; https页面是没法调用http下的js和css的; 微博秀是需要用iframe来嵌入的,博客园默认不支持iframe标签,可通过构造