华为机试——垃圾短信识别

#include
#include
#include
#include
using namespace std;
int map_g[100][100];
	int m_find[20];
map my;
int check(int m,int n){
	/*
	A发送短信的接收者中,没有发过短信给A的人数 > L。
	A发送的短信数 - A接收的短信数 > M。
	如果存在X,A发送给X的短信数-A接收到X的短信数 > N。
	L = 20 M = 50 N = 10 
   */
	//m表示m_find下标 n表示边的数目
	int flag=0;
	int out_deg=0;//出度
	int r_deg=0;//入度
	int out_t=0;
	int in_t=0;
	int m_index=my[m_find[m]];//找到映射
	for(int i=1;i<=n;i++){
		if(map_g[m_index][i]>0){
			out_deg++;
			out_t+=map_g[m_index][i];
		}
		if((map_g[m_index][i]-map_g[i][m_index])>10){
			//最后一个条件
			flag=1;
			break;
		}

	}

	for(int i=1;i<=n;i++){
		if(map_g[i][m_index]){
			r_deg++;
			in_t+=map_g[i][m_index];
		}
	}
	int l=(out_deg-r_deg);//没有给A发送的短信人数
	//出度减去入度
	int s=out_t-in_t;//短信数
	if(l>20||s>50)
		flag=1;
	return flag;
}
int main(){
	/*
	 华为机试 垃圾短信识别
	 author :zhaoziyan
	 date : 20140401
	 思路用有向图,同时因为节点数字太大,建立映射,边的权重表示x—>y,x发送给y的短信数量
	有向图用矩阵来建立
	*/
	
	memset(map_g,0,sizeof(map_g));
	//string 表示的是id号,int 表示的是在图的矩阵中的下标
	//c语言没有map可以用结构体来实现,不过要处理元素的查找,以及去重等等。
	
	map::iterator ptr;
	int s_id,r_id;

	int num=0;
	char c;
	scanf("%d",&m_find[num++]);
	c=getchar();
	while(c!='\n'){
		scanf("%d",&m_find[num++]);
		c=getchar();
	}
	int count=0;
	int real_id,real_id2;

	while(cin>>s_id>>r_id){
		
	//test
		//my[s_id]++;
		//my[r_id]++;
		if(my[s_id]==0) my[s_id]=++count;
		//my[s_id]是否表示插入了
		if(my[r_id]==0) my[r_id]=++count;
		//==0表示这个元素不存在
		real_id=my[s_id];
		real_id2=my[r_id];
		map_g[real_id][real_id2]++;//发送的短信数目加
	}
	int m_size=my.size();
	for(int i=0;i

垃圾短信识别 
描述: 大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别。
经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信。如下图所示。

现在请你根据历史短信记录,识别出垃圾短信发送者。


某人A符合以下条件之一,则认为是垃圾短信发送者:

üA发送短信的接收者中,没有发过短信给A的人数 > L。
üA发送的短信数 - A接收的短信数 > M。
ü如果存在X,A发送给X的短信数-A接收到X的短信数 > N。
本题中:


L = 20


M = 50


N = 10 


运行时间限制: 无限制 
内存限制: 无限制 
输入: 查询是否垃圾短信发送者,一行,多个发送者,以空格隔开


增加短信发送记录,多行,每行一次发送记录,2个非负整数,格式:发送者 接收者,以空格隔开

输出: 针对查询者,是垃圾短信发送者返回1,否则返回0(包括短信发送者无发送记录等情况)。样例是查询2位:90909090 20
其中90909090是垃圾短信发送者,20不是,输出:1 0


以一个空格隔开。
 
样例输入: 
90909090 20
90909090 0
90909090 1
90909090 2
90909090 3
90909090 4
90909090 5
90909090 6
90909090 7
90909090 8
90909090 9
90909090 10
90909090 11
90909090 12
90909090 13
90909090 14
90909090 15
90909090 16
90909090 17
90909090 18
90909090 19
90909090 20
90909090 21
90909090 22
90909090 23
90909090 24
90909090 25
90909090 26
90909090 27
90909090 28
90909090 29
0 90909090 
样例输出: 1 0 
答案提示:  C语言可以使用下面的方法: unsigned int SenderId; unsigned int ReceiverId;  while (scanf("%d %d",&SenderId,&ReceiverId) != EOF)  //异常时退出处理  {       //处理短信发送记录   } 

你可能感兴趣的:(面试等,算法)