L2-019静かにフォローする(C言語、二分探索)

トピック

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;
}

おすすめ

転載: blog.csdn.net/qq_45880043/article/details/108914047