UVA10935 - 副本

发布时间:2026/7/21 7:42:12
UVA10935 - 副本 UVA10935 卡片游戏 Throwing cards away I题目描述PDF输入格式输出格式输入输出样例 #1输入 #17 19 10 6 0输出 #1Discarded cards: 1, 3, 5, 7, 4, 2 Remaining card: 6 Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14 Remaining card: 6 Discarded cards: 1, 3, 5, 7, 9, 2, 6, 10, 8 Remaining card: 4 Discarded cards: 1, 3, 5, 2, 6 Remaining card: 4题目大意有一叠有序的纸牌一共有 n 张纸牌编号是 1 ~ n。初始状态下编号 1 的牌在整叠牌最上面编号 n 的牌在最底下。只要牌堆里还剩至少两张牌就不断重复下面这套操作把最顶上那张牌直接丢掉并将现在新出现在顶部的那张牌挪到整叠牌的最底部。你要算出两部分结果所有被丢掉的牌的先后顺序以及最后牌堆里剩下的那唯一一张牌。输入格式输入由多行数字组成除了最后一行以外每一行都有一个整数 nn ≤ 50最后一行固定是数字 0读到这一行时不需要进行任何计算处理程序直接结束。输出格式每读取一个有效数字 n就要打印两行内容第一行输出所有被丢弃纸牌的顺序第二行输出最后剩下的那张纸牌。输出的两行文字开头、结尾都不能有多余空格格式参照题目给出的样例。解题思路创建队列模拟牌堆依次将数字 1 到 n 存入队列再创建列表保存被丢弃的纸牌。只要队列内纸牌数量不少于两张就持续循环每次先取出队首纸牌存入丢弃列表接着取出新的队首纸牌并放到队列末尾。循环结束后队列只会剩下一张纸牌之后遍历丢弃列表按照规定格式拼接字符串最后打印出丢弃纸牌序列与留存的纸牌。完整代码importjava.util.LinkedList;importjava.util.List;importjava.util.Queue;importjava.util.Scanner;publicclassThrowingCardsAwayIRe{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);while(true){intnsc.nextInt();if(n0){break;}throwCards(n);}sc.close();}publicstaticvoidthrowCards(intn){QueueIntegerqueuenewLinkedList();ListIntegerdiscardnewLinkedList();for(inti0;in;i){queue.add(i1);}while(queue.size()2){intthrowCrdqueue.poll();discard.add(throwCrd);intmoveCardqueue.poll();queue.offer(moveCard);}intfinalRemainqueue.peek();StringBuildersbnewStringBuilder(Discarded cards:);for(Integeri:discard){sb.append( ).append(i);}System.out.println(sb);System.out.println(Remaining card: finalRemain);}}