トピック
Sina Weiboには「静かなフォロー」があり、静かにフォローしているユーザーはウォッチリストに表示されませんが、システムは静かにフォローしている人が公開したWeiboをユーザーにプッシュします。それでは、ある人の監視リストと他のユーザーに対する彼らの好みに基づいて、ネットワーク探偵になりましょう。密かにフォローされている可能性のある人を選び出します。
入力フォーマット:
1行目に特定のユーザーのウォッチリストを入力します。フォーマットは次のとおりです。
人数Nユーザー1ユーザー2……ユーザーN
ここで、Nは5000を超えない正の整数であり、各ユーザーi(i = 1、…、N)は、その後に続くユーザーのIDであり、 4桁の数字英字で構成された文字列で、各項目はスペースで区切られます。
次に、ユーザーの「いいね」情報を入力します。最初に、10000を超えない正の整数Mを入力し、次にM行を入力します。各行は、スペースで区切られたユーザーIDとユーザーへのいいねの数(1000以下)を指定します。注:ユーザーIDは、ユーザーの一意のIDです。タイトルは、ウォッチリストに重複するユーザーがなく、同様のメッセージに重複するユーザーがいないことを保証します。
出力形式:
ユーザーのいいねの数は、ユーザーの平均のいいねの数よりも多いと考えられ、ウォッチリストに載っていない人は、静かにフォローしている人である可能性があります。この仮説によれば、密かに人をフォローしている可能性のあるユーザーIDをアルファベットの昇順で1行に1つずつ出力してください。そのような人がいない場合は、「BingMeiYou」を出力します。
入力例1:
10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60
出力サンプル1:
Ammy
Cath
Pota
入力例2:
11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29
出力サンプル2:
Bing Mei You
**アイデアの分析:**このトピックが静かな注意を満足させるには、2つの条件があり
ます。1。ユーザーのいいねの数が、すべてのユーザーの平均のいいねの数よりも多い。
2.ユーザーIDをファンIDのリストに含めることはできません
。s1を使用して最初の行に指定されたファンID
を保存します。構造を使用してユーザーのIDといいねの数を保存します。
struct stu{
char s[10];
int num;
};
s2は、静かにフォローしているユーザーのリストを保存します。
注:タイトルには、ユーザーIDのアルファベット順に昇順で出力する必要があります。静かにフォローしているユーザーである可能性があり
ます。2つのforループは、直接検索に使用されるためです。、遅くなり、タイムアウトになるので、速い2点を使用します。検索方法
最初にs1のリストを小さいものから大きいものに並べ替え、次にバイナリ検索を実行し、次に見つかったリストs2を並べ替え、最後に
バイナリ検索を出力します
。flat= 0見つからないマークとして、見つかった場合は1としてマークし
ます1.左右の境界の値が6であるかどうかを判断します
2.次にmidが6であるかどうかを判断し
ます3.どちらでもない場合、midの値がより大きい場合6は、6が左側にあり、右側の境界がright = mid、それ以外の場合はleft = midであることを意味し
ます。6を見つけます。ループを終了します
。この場合、この時点で6を探し、左右の境界は次のようになります。あるかどうかを判断し、right-left = 1で終了します
コード:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct stu{
char s[10];
int num;
};
int cmp(const void *a,const void *b){
char *s1 = (char*)a;
char *s2 = (char*)b;
return strcmp(s1,s2);
}
int main(int argc, char *argv[]) {
struct stu p[10005];
int n,m,i,j;
scanf("%d",&n);
char s1[n][10];
for(i=0;i<n;i++){
scanf("%s",s1[i]);
}
qsort(s1,n,sizeof(s1[0]),cmp); //先对s1进行排序,用来二分查找
int avg = 0;
scanf("%d",&m);
char s2[m][10];
for(i=0;i<m;i++){
scanf("%s%d",p[i].s,&p[i].num);
avg += p[i].num;
}
avg /= m;
int count = 0;
for(i=0;i<m;i++){
if(p[i].num>avg){
int flat = 0; //标记
int left = 0,right = n-1;
if(strcmp(s1[left],p[i].s)<=0&&strcmp(s1[right],p[i].s)>=0) {
while(1){
//二分查找
if(strcmp(s1[left],p[i].s)==0){
flat = 1;
break;
}
if(strcmp(s1[right],p[i].s)==0){
flat = 1;
break;
}
if(right-left==1){
flat = 0;
break;
}
int mid = (right+left)/2;
if(strcmp(s1[mid],p[i].s)==0){
flat = 1;
break;
}
if(strcmp(s1[mid],p[i].s)>0){
right = mid;
}else{
left = mid;
}
}
}
if(flat==0){
strcpy(s2[count++],p[i].s);
}
}
}
qsort(s2,count,sizeof(s2[0]),cmp);
if(count==0){
printf("Bing Mei You");
}else{
for(i=0;i<count;i++){
printf("%s\n",s2[i]);
}
}
return 0;
}