iT邦幫忙

0

內容
二次世界大戰諾曼第登陸戰況激烈,盟軍雖勝但也犧牲慘重; 戰事結束後,士官長開始清點士兵人數,
透過士兵隨身的兵籍牌號碼,希望知道有多少士兵不幸陣亡,但人數眾多,清點不易,況且
兵籍號碼也出現重覆登記的現象,請你幫忙解決此一難題。

輸入說明
多筆測資,每筆測資兩行,
第一行兩個整數 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

看更多先前的討論...收起先前的討論...
正確答案:諾曼第登陸時尚無電腦,此題無解。
dragonH iT邦超人 7 級 ‧ 2020-05-18 09:51:52 檢舉
選 A
pinglam iT邦新手 5 級 ‧ 2020-05-18 10:26:04 檢舉
笑死,sam大的答案非常合邏輯
https://en.wikipedia.org/wiki/Z1_(computer)
1938年德國的電腦
這個題目是哪個白爛出的? 說明跟範例都對不起來了.
@一級屠豬士
林口高中基礎題
http://course.lksh.ntpc.edu.tw/ShowProblem?problemid=W053
題目描述好難懂
空白都沒貼好.
看來是隱含 號碼由1開始, 但是這個沒有明確說啊.還要去猜.
我覺得這個題目出的很不好
不好的原因是「拿戰爭的死亡士兵來做文章」這個梗
讓我想起
電影搶救雷恩大兵裡他們嘻嘻哈哈地圍坐在一起找雷恩的兵籍名牌那一幕 ..... -_-|||
兵籍號的條件看起來是從1開始的「連續」正整數,這是從題目中的範例歸納的。如果實際上的測資不符合這個條件,就只能送分。
匿名 iT邦新手 5 級 ‧ 2020-05-19 21:43:45 檢舉
這題是林口高中的題目。
2
yu2001
iT邦新手 5 級 ‧ 2020-05-19 20:28:31
最佳解答
#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
那就開個陣列紀錄回來的士兵號碼就好
把回來的士兵號碼做個記號
答案就輸出沒做記號的士兵號碼就好
在設個變數判斷是不是全部的士兵都有回來
如果有就輸出

https://ithelp.ithome.com.tw/upload/images/20200519/20122289tgSKNypr0L.png

匿名 iT邦新手 5 級 ‧ 2020-05-19 21:45:51 檢舉

非常感謝您的幫忙,不過有簡單點的打法嗎?本人才剛入門,希望有好懂些的打法,很長也沒關西

這個程式,你們確定是這樣的嗎?

yu2001 iT邦新手 5 級 ‧ 2020-05-20 11:09:37 檢舉

題目講述不清,也只能用猜測的,沒辦法
也有可能是測資不夠嚴謹被我賽過了也說不定XD

10
一級屠豬士
iT邦高手 1 級 ‧ 2020-05-18 13:29:32

我還是幫他寫了一下.當然先把測試資料存成檔案,然後讀取處理.雖然看起來正常,但故意少了一個排序步驟,若能補上,才會比較可靠穩定,這個就留給他了.

#!/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)

執行結果如下圖:
https://ithelp.ithome.com.tw/upload/images/20200518/200506479ZFUjAqEGp.png

看更多先前的回應...收起先前的回應...

結果可能會是「沒有幫助」
因為他們是 C++ 的作業
/images/emoticon/emoticon20.gif

匿名 iT邦新手 5 級 ‧ 2020-05-19 21:41:59 檢舉

謝謝您的幫忙,雖然這題是要用c++的,但還是非常感謝!

e6319a5b iT邦新手 5 級 ‧ 2020-05-24 14:45:43 檢舉

大大您寫得好像有錯
我用您的程式碼測試

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}//正解
@ //您的輸出

哪裡錯誤,你這樣貼,也沒說哪裡,還蠻難協助你的.

e6319a5b iT邦新手 5 級 ‧ 2020-05-24 15:13:09 檢舉

我修改過我上面回復了~

你知道題目那裡有說 一樣長度,就輸出 @ 那段嗎?

這個題目本身設計是要輸入,所以設計第一行,是兩個數字.
然後他沒有定義清楚,所以這裡我並沒有去做後面確定,是不要直接把全部作業寫出來,你們要去觀察思考.
那你應該是去看哪裡修正,會比較好.

e6319a5b iT邦新手 5 級 ‧ 2020-05-24 15:27:15 檢舉

他說的是"如果全部士兵都生還,則輸出 '@'" 所以不能單純的用n==m判斷
個人見解

對啊,你也發覺了啊. 這是隱藏的啊,所以你可以修改啊.

通靈亡 iT邦新手 3 級 ‧ 2020-05-25 13:24:38 檢舉

e6319a5b
[6, 5, 4, 2, 2, 5]
笨拙一點的作法
你把重複的數字剃掉再判斷數字 => [6,5,4,2]
這樣不就可以知道生還的人 => [1,3]

如果你像樓主真的傻傻的直接拿人家正確的程式碼
沒有自己思考過作法,一定會直接被老師電

e6319a5b iT邦新手 5 級 ‧ 2020-05-27 15:29:25 檢舉

@ted59438 直接用差集就好了

hints
if list not in [X] 檢查沒有在隊列裡的士兵
print("The current surviving soldier number is %s" % yourlist[0])

2
海綿寶寶
iT邦大神 1 級 ‧ 2020-05-19 08:54:07

趕快去隔壁「技術文章」區
找一位心原一馬大大
他最近有在刷 LeetCode
可以試著拜託他
順便刷一下林口高中的 ZeroJudge

選我正解

嗯…建議可以先移至提問的智慧(原作者: Hacker Eric S. Raymond),選我正解

匿名 iT邦新手 5 級 ‧ 2020-05-19 21:54:46 檢舉

好的,謝謝您,我會詳讀的,本人不太會問問題造成各位大大感到反感十分抱歉。

0
e6319a5b
iT邦新手 5 級 ‧ 2020-05-24 14:46:34
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)
    

我要發表回答

立即登入回答