1. 程式人生 > >7-4 帥到沒朋友(20 分)

7-4 帥到沒朋友(20 分)

//最近又做了這道題,把第一次和這次的程式放上來,感覺差別好大,也明顯看出了自己寫程式碼能力的提升

7-4 帥到沒朋友(20 分)

當芸芸眾生忙著在朋友圈中發照片的時候,總有一些人因為太帥而沒有朋友。本題就要求你找出那些帥到沒有朋友的人。

輸入格式:

輸入第一行給出一個正整數N100),是已知朋友圈的個數;隨後N行,每行首先給出一個正整數K1000),為朋友圈中的人數,然後列出一個朋友圈內的所有人——為方便起見,每人對應一個ID號,為5位數字(從00000到99999),ID間以空格分隔;之後給出一個正整數M10000),為待查詢的人數;隨後一行中列出M個待查詢的ID,以空格分隔。

注意:沒有朋友的人可以是根本沒安裝“朋友圈”,也可以是隻有自己一個人在朋友圈的人。雖然有個別自戀狂會自己把自己反覆加進朋友圈,但題目保證所有K

超過1的朋友圈裡都至少有2個不同的人。

輸出格式:

按輸入的順序輸出那些帥到沒朋友的人。ID間用1個空格分隔,行的首尾不得有多餘空格。如果沒有人太帥,則輸出No one is handsome

注意:同一個人可以被查詢多次,但只輸出一次。

輸入樣例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888

輸出樣例1:

10000 88888 23333

輸入樣例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

輸出樣例2:

No one is handsome
我的程式:

第一次寫的程式:

#include <iostream>
using namespace std;
int main()
{
int id[100000]={0};
int key[101]={0};
int p=0;
int N,k,M,ID,flag=0;
int i=0;
int m[10001]={0};
cin>>N;
if(N==0) return 0;
while(N--)
{   
cin>>k;
if(k==1) {cin>>ID;id[ID]++;key[p]=ID;p++;}//只有自己
else while(k--)
{cin>>ID;id[ID]++;}
}
//判斷
while(p>=0)
{
if(id[key[p]]==1) id[key[p]]=0;
p--;
}
cin>>M;
for(i=0;i<M;i++)
  cin>>m[i];
    for(i=0;i<M;i++)
if(id[m[i]]==0) {if(flag==0) {//輸出前補零
if(m[i]>=1000&&m[i]<=9999) cout<<0<<m[i];
else if(m[i]>=100&&m[i]<=999) cout<<"00"<<m[i];
else if(m[i]>=10&&m[i]<=99) cout<<"000"<<m[i];
else if(m[i]>=1&&m[i]<=9) cout<<"0000"<<m[i];
else if(m[i]==0)  cout<<"00000";
else cout<<m[i];
flag=1;}
else{ 
if(m[i]>=1000&&m[i]<=9999) cout<<' '<<0<<m[i];
else if(m[i]>=100&&m[i]<=999) cout<<" 00"<<m[i];
else if(m[i]>=10&&m[i]<=99) cout<<" 000"<<m[i];
else if(m[i]>=1&&m[i]<=9) cout<<" 0000"<<m[i];
else if(m[i]==0)  cout<<" 00000";
else cout<<' '<<m[i];
id[m[i]]=1;}
}
    if(flag==0) cout<<"No one is handsome";
return 0;
}

第二次寫的程式://更優化,更簡潔,更快,更省記憶體

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int ID[100000];
int main(){
	int N;//有多少個朋友圈
	int k;//每個朋友圈的人數 
	cin>>N; 
	//輸入朋友圈資訊 
	int id;
	for(int i=0;i<N;i++){
		cin>>k;
		if(k==1) {cin>>id;continue;}
		for(int j=0;j<k;j++)
		   {cin>>id; ID[id]++;
		   }
	}
	cin>>k;//要查詢k個人 
	vector<int>v;//存放沒朋友的人 
	//查詢
	for(int i=0;i<k;i++) {
		cin>>id;
		if(ID[id]==0) { 
		      v.push_back(id);
		      ID[id]=1;//標記避免重複 
			  }
	}
	//輸出 
	int flag=1;//標記變數 
	if(v.empty()) {cout<<"No one is handsome";return 0;}
	else for(int i=0;i<v.size();i++){
		 if(flag){printf("%05d",v.at(i));flag=0;}
		 else printf(" %05d",v.at(i));
	}
	return 0;
}