內容
二次世界大戰諾曼第登陸戰況激烈,盟軍雖勝但也犧牲慘重; 戰事結束後,士官長開始清點士兵人數,
透過士兵隨身的兵籍牌號碼,希望知道有多少士兵不幸陣亡,但人數眾多,清點不易,況且
兵籍號碼也出現重覆登記的現象,請你幫忙解決此一難題。
輸入說明
多筆測資,每筆測資兩行,
第一行兩個整數 N、M,N 為參戰的士兵人數,M 為登記號碼數,
第二行有 M 個整數,代表回歸士兵的登記的兵籍號碼。
(1 < N、M <10000)
輸出說明
每筆測資輸出一行,
輸出所有不幸喪生的士兵兵籍號碼 (由小到大)。
如果全部士兵都生還,則輸出 '@'
格式如範例
範例輸入
7 4
3 1 5 7
6 6
6 1 3 2 5 4
6 8
6 1 1 1 2 5 2 5
範例輸出
2 4 6
@
3 4
#include <iostream>
using namespace std;
int main()
{
int n,m,tmp;
for (;cin >> n >> m;)
{
int arr[10001]{0};
int flag=0;
for (int i = 0; i < m;++i)
{
cin >> tmp;
arr[tmp] = 1;
}
for (int i = 1;i<=n;++i)
{
if(!arr[i])
{
cout << i << " ";
flag = 1;
}
}
cout<<(flag?"\n":"@\n");
}
}
以範例測資判斷,士兵編號應該是從1開始
我的想法是:
既然測資範圍只到10000
那就開個陣列紀錄回來的士兵號碼就好
把回來的士兵號碼做個記號
答案就輸出沒做記號的士兵號碼就好
在設個變數判斷是不是全部的士兵都有回來
如果有就輸出@
我還是幫他寫了一下.當然先把測試資料存成檔案,然後讀取處理.雖然看起來正常,但故意少了一個排序步驟,若能補上,才會比較可靠穩定,這個就留給他了.
#!/usr/bin/env python3
counter = 0
with open('ithelp200518_testdata.txt') as fin:
for line in fin:
counter = counter + 1
splst = line.split()
if counter % 2 == 1:
n = int(splst[0])
m = int(splst[1])
else:
if n == m:
print('@')
else:
soldierlst = line.split()
soldierlst = list(map(int, soldierlst))
soldierset = set(soldierlst)
stupidset = set([x for x in range(1, n+1)])
difflst = list(stupidset - soldierset)
print(*difflst)
執行結果如下圖:
結果可能會是「沒有幫助」
因為他們是 C++ 的作業
謝謝您的幫忙,雖然這題是要用c++的,但還是非常感謝!
大大您寫得好像有錯
我用您的程式碼測試
import random
n=6
m=6
member=[random.randint(1,m) for i in range(n) ]
print(member)
if n == m:
print('@')
else:
soldierlst = member
soldierlst = list(map(int, soldierlst))
soldierset = set(soldierlst)
stupidset = set([x for x in range(1, n+1)])
difflst = list(stupidset - soldierset)
print(*difflst)
[6, 5, 4, 2, 2, 5]
{1, 3}//正解
@ //您的輸出
哪裡錯誤,你這樣貼,也沒說哪裡,還蠻難協助你的.
我修改過我上面回復了~
你知道題目那裡有說 一樣長度,就輸出 @ 那段嗎?
這個題目本身設計是要輸入,所以設計第一行,是兩個數字.
然後他沒有定義清楚,所以這裡我並沒有去做後面確定,是不要直接把全部作業寫出來,你們要去觀察思考.
那你應該是去看哪裡修正,會比較好.
他說的是"如果全部士兵都生還,則輸出 '@'" 所以不能單純的用n==m判斷
個人見解
對啊,你也發覺了啊. 這是隱藏的啊,所以你可以修改啊.
e6319a5b
[6, 5, 4, 2, 2, 5]
笨拙一點的作法
你把重複的數字剃掉再判斷數字 => [6,5,4,2]
這樣不就可以知道生還的人 => [1,3]
如果你像樓主真的傻傻的直接拿人家正確的程式碼
沒有自己思考過作法,一定會直接被老師電
@ted59438 直接用差集就好了
hints
if list not in [X] 檢查沒有在隊列裡的士兵
print("The current surviving soldier number is %s" % yourlist[0])
趕快去隔壁「技術文章」區
找一位心原一馬大大
他最近有在刷 LeetCode
可以試著拜託他
順便刷一下林口高中的 ZeroJudge
選我正解
import random
n=6
m=6
member=[random.randint(1,n) for i in range(m) ]
print(member)
#member=[6,1,3,2,5,4]
lists=[]
for i in range(m):
lists.append(member[i])
numbers=range(1,n+1)
a=set(numbers).difference(lists)
if(a==set()):
print('@')
else:
print(a)