12-题目1156:谁是你的潜在朋友

来源:互联网 发布:淘宝新锐卖家审核标准 编辑:程序博客网 时间:2024/05/29 08:16

http://ac.jobdu.com/problem.php?pid=1156

题目描述:

    “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。
    首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。


自己写的算法太麻烦了,我弄了一个结构体,表示编号和偏好,然后再排序,再统计每段相同的个数,再在对应编号的新数组里输出相同的个数。。。。。。
结果别人的代码非常简单,对书做了一个数组,把偏好作为书数组的下标,遍历一遍,相同的+1即可,最后再遍历输出。

//题目1156:谁是你的潜在朋友#include<stdio.h>  #include<iostream> #include <fstream>#include<algorithm>using namespace std;typedef struct Reader{int ID;int prefer;}Reader;bool cmp(Reader a, Reader b){return a.prefer < b.prefer;}int main(){int n, m, i;//n为每组数据的人数,共m本书//ifstream cin("data.txt");while (cin >> n >> m){Reader *reader = new Reader[n];int *Friend = new int[n];  //不能用friend,因为友元函数friendint count = 0;for (i = 0; i < n; i++){reader[i].ID = i;cin >> reader[i].prefer;}sort(reader, reader + n, cmp);   //将读者按照喜爱的书递增排序,如2,2,2,2,3,3,4,5,5....for (i = 0; i < n; i++){if (reader[i].prefer == reader[i + 1].prefer){if (i == n - 1)    //处理最后一组相同的数据for (int j = i; j >= i - count; j--)Friend[reader[j].ID] = count;elsecount++;}else{for (int j = i; j >= i - count; j--)Friend[reader[j].ID] = count;count = 0;}}for (i = 0; i < n; i++){if (Friend[i] == 0)cout << "BeiJu" << endl;elsecout << Friend[i] << endl;}}//system("pause");return 0;}


优化算法:
//题目1156:谁是你的潜在朋友#include<stdio.h>  #include<iostream> #include <fstream>using namespace std;int main(){int n, m;//ifstream cin("data.txt");while (cin >> n >> m){int *reader = new int[n];int book[200] = { 0 };for (int i = 0; i < n; i++){cin >> reader[i];book[reader[i]]++;}for (int i = 0; i < n; i++){if (book[reader[i]] == 1)cout << "BeiJu" << endl;elsecout << book[reader[i]] - 1 << endl;}}//system("pause");return 0;}


0 0
原创粉丝点击