2023程序设计竞赛选拔赛实训:计算特定排列数 // 注意排列规则及程序设计

0 下载量 59 浏览量 更新于2024-03-25 收藏 57KB DOC 举报
2021年程序设计竞赛选拔赛实训要求参赛者解决排列数问题,即给定1个“1”,2个“2”,和k个“3”(其中1≤k≤6),问能构成多少个不同排列。在解决这一问题的过程中,需要注意一些设计要点。首先,可以将这些数构成一个k3位数,其中通过k2个10相乘来计算k3位数的起点。这个起点为b=10^(k2),为枚举提供范畴t(b—4*b-1)。为了检测k3位数t具有多少个数字1、2、3,可以将每个k3位整数t赋给d(以保持t不变),然后通过k3次求余先后分离出t个数字c。如果c等于1,则记录整数t中数字1的个数f;如果c等于2,则记录整数t中数字2的个数g;如果c等于3,则记录整数t中数字3的个数h。检测每一种k3位整数:若f等于1且g等于2且h等于k,则应用s进行记录。最终,输出所得排列个数s。 为了编写程序解决这个问题,可以采用以下设计思路: ```cpp #include <iostream> #include <cmath> using namespace std; int main() { int k; cin >> k; int count = 0; for(int i = pow(10, k*2); i < 4*pow(10, k*2); i++) { int t = i; int d = t; int f = 0, g = 0, h = 0; for(int j = 0; j < k*3; j++) { int c = t % 10; if(c == 1) f++; else if(c == 2) g++; else if(c == 3) h++; t /= 10; } if(f == 1 && g == 2 && h == k) count++; } cout << count << endl; return 0; } ``` 这个程序会首先接受输入的k值,然后通过循环枚举所有可能的k3位数。在循环内部,程序会将每个k3位数t分解为单个数字,并统计数字1、2、3的个数。最后,如果满足f=1且g=2且h=k的条件,将计数器count加1。最终输出count的值,即为所得排列个数。 这个程序设计方法可以帮助参赛者解决排列数问题,也展示了如何在程序中合理利用循环和条件判断来解决复杂的排列问题。通过不断练习和思考,参赛者可以提高自己的程序设计能力,为竞赛中取得更好的成绩打下坚实的基础。
2023-02-27 上传
1. 俄罗斯套娃问题 伊万洛夫在比武大会上力克群雄,成为新一届"草原雄鹰",为部落赢得了莫大荣誉。首 领决定要重重奖赏,他对伊万洛夫说:"孩子,你是知道的,面前的这片草原,南北向和 东西向的道路纵横交错。现在,路口放着纯金打造的俄罗斯娃娃,重量大小不等,重的 都能装下轻的。你可以沿着道路飞奔,拾取路口的娃娃,要求是任何时刻必须是一个套 娃,装好后就不能再拆开了。注意不要走重复路。" 请你为伊万洛夫规划路线,使得他能够有最大的收获。 Input: cross.txt 输入包括多组测试用例; 每个测试用例开始是一对整数<R, C>,R表示东西向道路数,C表示南北向道路总数;接下来R行,每行包括C个正整数W[r, c] ,分别表示第r条东西向道路与第c条南北向道路交叉处路口放置的俄罗斯娃娃的重量。 Output: 输出能有最大收获的路径规划。 假设1: cross.txt 2 7 1 2 13 6 7 12 11 14 3 4 5 8 9 10 输出: 1 2 3 4 5 6 7 8 9 10 11 12 假设2: cross.txt 5 5 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 注释: 1)从<0,0>出发; 2)路线不能重复; 3)不要求最后回到出发点。 2. 教师安排家访 输入文件:student.txt distance.txt 你是小学某班主任,需要安排周六进行家访。于是打电话与家长联系,他们表示虽然比 较忙,但还是会为你抽出一点时间。 由于有些家长时间上有冲突,并且一天内不能拜访所有家长,你需要一个程序安排一天 的工作,使得你可以拜访最多的家长。注意,如果与某个家长见面,拜访时间不得少于 45分钟(M),否则可能引起家长不满意。另外从一个家长到另外一个家长需要花费一些 时间。 Input1: student.txt 输入包括多个测试数据,每个测试数据开头是一个整数n(1<=n<=40),表示家长总数。 接下来n行每行包括三个正整数m、s、t。m表示家长的序号,s、t分别表示该家长空闲时 间段的起始时间和终止时间,s小于t。注意两个数字的最后两位表示分钟。 比如1645 表示16时45分 样本如下: 6 1 800 1100 2 800 900 3 845 1000 4 1300 1400 5 1345 1800 6 1500 1700 Input2: distance.txt 第一行为 家长总数 随后为一个二维表格,记录每2个用户之间的距离。第二行和第一列数据为家长顺序编号 。其他数据为2个家长之间的距离。 样本如下: 6 0 1 2 3 4 5 6 1 0 1 2 4 3 1 2 1 0 3 5 3 2 3 2 3 0 6 1 3 4 4 5 6 0 4 14 5 3 3 1 4 0 15 6 1 2 3 14 15 0 Output: 拜访的家长总数 拜访的家长的序号和开始结束时间 3. 布雷程序 在一个10*10的方格中,随机分布10个地雷,并在其它没有地雷的格中显示该方格周 围相邻的方格中共有几枚地雷。 样例输出:(图中- 1的位置表示地雷,其它值表示该位置相邻的八个格子中的地雷数) 基本要求:掌握程序循环和算法设计的基本方法;掌握复杂算法设计的方法。 Example: 0 1 -1 1 0 1 -1 2 1 1 0 1 1 1 0 1 2 3 -1 1 0 0 0 1 1 1 1 -1 2 1 1 2 2 2 -1 1 1 1 1 0 1 -1 -1 2 1 1 0 0 1 1 1 2 2 1 0 0 1 1 2 -1 0 0 0 0 0 0 1 -1 2 1 1 1 1 0 0 0 1 1 1 0 1 -1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 4. 电路业务合并 在网络电路,为了表示1条电路表示成速率、A、方向、Z. 1、速率有VC12,VC4等。 2、方向为单向-->、双向<->。 3、节点A(或Z)包括网元名称、单板、端口号。 电路在开通时,为了方便管理,往往每组电路是连续的。如: VC12 22局S385扩1 EPE1[1-1-2] [2] <--> 23局S385扩1 EPE1[1-1-2] [2] 如果电路太多一条一条显示则信息量太大,用户查看很不方便。现在用户要求连续的 电路合并起来显示。连续的电路是如果两条业务A1Z1,A2Z2. 如速率一样,A1和A2网元名称,单板一样,断口号相邻。Z1和Z1网元名称,单板一样, 断口号相邻。且