C++算法篇 模拟算法

1、P1059 明明的随机数   NOIP 2006 普及组 第一题

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

输入有两行,第1行为1个正整数,表示所生成的随机数的个数N

第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是两行,第1行为1个正整数M,表示不相同的随机数的个数。

第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入输出样例

输入

10

20 40 32 67 40 20 89 300 400 15

输出
8

15 20 32 40 67 89 300 400

说明/提示

 

2、金币  NOIP 2006 普及组 第四题

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入格式

一个正整数K,表示发放金币的天数。

输出格式

一个正整数,即骑士收到的金币数。

输入输出样例

输入 

6

输出

14

输入 

1000

输出

29820

说明/提示

【输入输出样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。

对于 100%的数据,1≤K≤10,000。

 

3、陶陶摘苹果     NOIP 2005 普及组 第一题

题目描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式

输入包括两行数据。第一行包含 10 个 100 到 200 之间(包括 100 和 200 )的整数(以厘米为单位)分别表示 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 到 120 之间(包含 100 和 120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

输入输出样例

输入

100 200 150 140 129 134 167 198 200 111
110

输出 

5

 

4、数字统计    NOIP 2010 普及组 第二题

题目描述

请统计某个给定范围[L,R]的所有整数中,数字 2 出现的次数。

比如给定范围[[2,22],数字2在数 2中出现了 1 次,在数12 中出现 1 次,在数 20 中出现 1次,在数 21 中出现 1 次,在数 22 中出现 2次,所以数字22 在该范围内一共出现了 6次。

输入格式

2个正整数 L 和 R,之间用一个空格隔开。

输出格式

数字 2出现的次数。

输入输出样例

输入 

2 22

输出 

6

输入 

2 100

输出

20

说明/提示

  1≤L≤R≤100000。

 

5、校门外的树    NOIP 2005 普及组 第二题

题目描述

某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l 的位置;数轴上的每个整数点,即 0,1,2,…,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 ll 和区域的数目 m。

接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例

输入 

500 3
150 300
100 200
470 471

输出 

298

说明/提示

数据规模与约定

  • 对于 20% 的数据,保证区域之间没有重合的部分。
  • 对于 100% 的数据,保证 1≤l≤10 ^4,1≤m≤100,0≤u≤v≤l。

6、买铅笔    NOIP 2016 普及组 第四题

题目描述

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。

输入格式

第一行包含一个正整数n,表示需要的铅笔数量。

接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种 包装内铅笔的数量,第2个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。

输出格式

1个整数,表示P老师最少需要花费的钱。

输入输出样例

输入 

57
2 2
50 30
30 27

输出 

54

输入 

9998
128 233
128 2333
128 666

输出 

18407

输入 

9999
101 1111
1 9999
1111 9999

输出 

89991

说明/提示

铅笔的三种包装分别是:

  • 2支装,价格为;
  • 50支装,价格为30;
  • 30支装,价格为27。

P老师需要购买至少57支铅笔。

如果她选择购买第一种包装,那么她需要购买29份,共计2×29=58支,需要花费的钱为2×29=58。

实际上,P老师会选择购买第三种包装,这样需要买2份。虽然最后买到的铅笔数 量更多了,为30×2=60支,但花费却减少为27×2=54,比第一种少。

对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买2份,实际的花费达到了 30×2=60,因此P老师也不会选择。

所以最后输出的答案是54。

【子任务】

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试 只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

上表中“整倍数”的意义为:若为K,表示对应数据所需要的铅笔数量n—定是每种包装铅笔数量的整倍数(这意味着一定可以不用多买铅笔)。

7、津津的储蓄计划    NOIP 2004 普及组 第一题

题目描述

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

输入格式

12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。

输出格式

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出−X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。

注意,洛谷不需要进行文件输入输出,而是标准输入输出。

输入输出样例

输入 

290
230
280
200
300
170
340
50 
90 
80 
200
60 

输出 

-7 

输入 

290 
230 
280 
200 
300 
170 
330 
50 
90 
80 
200 
60 

输出 

1580

 

8、Cantor表    NOIP 1999 普及组 第一题

题目描述

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

1/1 , 1/2 , 1/3 , 1/4, 1/5, …

2/1, 2/2 , 2/3, 2/4, …

3/1 , 3/2, 3/3, …

4/1, 4/2, …

5/1, …

我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…

输入格式

整数NN(1≤N≤107)。

输出格式

表中的第 N 项。

输入输出样例

输入 

7

输出 

1/4

 

9、三连击    NOIP 1998 普及组 第一题

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2,⋯,9共99个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

输入格式

木有输入

输出格式

若干行,每行3个数字。按照每行第1个数字升序排列。

输入输出样例

输入 

输出 

192 384 576
* * *
...

* * *

 

10、珠心算测验    NOIP 2014 普及组 第一题  

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

输入格式

共两行,第一行包含一个整数nn,表示测试题中给出的正整数个数。

第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式

一个整数,表示测验题答案。

输入输出样例

输入 

4
1 2 3 4

输出 

2

说明/提示

【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。

注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

对于100%的数据,3≤n≤100,测验题给出的正整数大小不超过10,000

 

11、接水问题   NOIP 2010 普及组 第三题

 

题目描述

学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。

现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到n编号,i号同学的接水量为 wi​。接水开始时,1到m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj​后,下一名排队等候接水的同学 k马上接替 j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第 x 秒结束时完成接水,则k 同学第 x+1 秒立刻开始接水。若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它m−n’个龙头关闭。

现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入格式

第 1行2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。

第 2 行 n 个整数w1​,w2​,…,wn​,每两个整数之间用一个空格隔开,wi​表示ii号同学的接水量。

输出格式

1个整数,表示接水所需的总时间。

输入输出样例

输入 

5 3

4 4 1 2 1

输出

4

输入

8 4

23 71 87 32 70 93 80 76

输出

163

说明/提示

【输入输出样例 1 说明】

第 1 秒,3人接水。第 1秒结束时,1,2,3号同学每人的已接水量为 1,3号同学接完水,4号同学接替 3 号同学开始接水。

第 2 秒,3人接水。第2 秒结束时,1,2号同学每人的已接水量为 2,4号同学的已接水量为1。

第 3 秒,3人接水。第3 秒结束时,1,2 号同学每人的已接水量为 3,4 号同学的已接水量为2。4 号同学接完水,5 号同学接替4号同学开始接水

第4秒,3人接水。第 4秒结束时,1,2 号同学每人的已接水量为 4,5号同学的已接水量为1。1,2,5 号同学接完水,即所有人完成接水的总接水时间为 4 秒。

【数据范围】

1≤n≤10000,1≤m≤100 且m≤n;1≤wi​≤100。

 

12、 神奇的幻方    NOIP 2015 提高组 第一题   

题目描述

幻方是一种很神奇的 N∗N 矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行、每列及两条对角线上的数字之和都相同。

当 N 为奇数时,我们可以通过下方法构建一个幻方:首先将 1 写在第一行的中间。之后,按如下方式从小到大依次填写每个数K(K=2,3,⋯,N×N) :

  1. 若 (K−1) 在第一行但不在最后一列,则将 K 填在最后一行,(K−1) 所在列的右一列;
  2. 若(K−1) 在最后一列但不在第一行,则将 K 填在第一列,(K−1) 所在行的上一行;
  3. 若 (K−1) 在第一行最后一列,则将 K 填在 (K−1) 的正下方;
  4. 若 (K−1) 既不在第一行,也不在最后一列,如果 (K−1) 的右上方还未填数,则将 K 填在(K−1) 的右上方,否则将 K填在 (K−1) 的正下方。

现给定 N ,请按上述方法构造 N×N 的幻方。

输入格式

一个正整数 N ,即幻方的大小。

输出格式

共 N 行 ,每行 N 个整数,即按上述方法构造出的 N×N 的幻方,相邻两个整数之间用单空格隔开。

输入输出样例

输入 

3

输出 

8 1 6
3 5 7
4 9 2

输入 

25

输出 

327 354 381 408 435 462 489 516 543 570 597 624 1 28 55 82 109 136 163 190 217 244 271 298 325
353 380 407 434 461 488 515 542 569 596 623 25 27 54 81 108 135 162 189 216 243 270 297 324 326
379 406 433 460 487 514 541 568 595 622 24 26 53 80 107 134 161 188 215 242 269 296 323 350 352
405 432 459 486 513 540 567 594 621 23 50 52 79 106 133 160 187 214 241 268 295 322 349 351 378
431 458 485 512 539 566 593 620 22 49 51 78 105 132 159 186 213 240 267 294 321 348 375 377 404
457 484 511 538 565 592 619 21 48 75 77 104 131 158 185 212 239 266 293 320 347 374 376 403 430
483 510 537 564 591 618 20 47 74 76 103 130 157 184 211 238 265 292 319 346 373 400 402 429 456
509 536 563 590 617 19 46 73 100 102 129 156 183 210 237 264 291 318 345 372 399 401 428 455 482
535 562 589 616 18 45 72 99 101 128 155 182 209 236 263 290 317 344 371 398 425 427 454 481 508
561 588 615 17 44 71 98 125 127 154 181 208 235 262 289 316 343 370 397 424 426 453 480 507 534
587 614 16 43 70 97 124 126 153 180 207 234 261 288 315 342 369 396 423 450 452 479 506 533 560
613 15 42 69 96 123 150 152 179 206 233 260 287 314 341 368 395 422 449 451 478 505 532 559 586
14 41 68 95 122 149 151 178 205 232 259 286 313 340 367 394 421 448 475 477 504 531 558 585 612
40 67 94 121 148 175 177 204 231 258 285 312 339 366 393 420 447 474 476 503 530 557 584 611 13
66 93 120 147 174 176 203 230 257 284 311 338 365 392 419 446 473 500 502 529 556 583 610 12 39
92 119 146 173 200 202 229 256 283 310 337 364 391 418 445 472 499 501 528 555 582 609 11 38 65
118 145 172 199 201 228 255 282 309 336 363 390 417 444 471 498 525 527 554 581 608 10 37 64 91
144 171 198 225 227 254 281 308 335 362 389 416 443 470 497 524 526 553 580 607 9 36 63 90 117
170 197 224 226 253 280 307 334 361 388 415 442 469 496 523 550 552 579 606 8 35 62 89 116 143
196 223 250 252 279 306 333 360 387 414 441 468 495 522 549 551 578 605 7 34 61 88 115 142 169
222 249 251 278 305 332 359 386 413 440 467 494 521 548 575 577 604 6 33 60 87 114 141 168 195
248 275 277 304 331 358 385 412 439 466 493 520 547 574 576 603 5 32 59 86 113 140 167 194 221
274 276 303 330 357 384 411 438 465 492 519 546 573 600 602 4 31 58 85 112 139 166 193 220 247
300 302 329 356 383 410 437 464 491 518 545 572 599 601 3 30 57 84 111 138 165 192 219 246 273
301 328 355 382 409 436 463 490 517 544 571 598 625 2 29 56 83 110 137 164 191 218 245 272 299

说明/提示

对于100%的数据,对于全部数据, 1≤N≤39 且 N 为奇数。

 

 

13、 斐波那契数列(升级版)    NOIP 1997 普及组 第一题

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

  • f(1)=1
  • f(2)=1
  • f(n)=f(n−1)+f(n−2) (n ≥ 2n≥2 且 n 为整数)。

题目描述

请你求出第n个斐波那契数列的数mod(或%)2^31之后的值。并把它分解质因数。

输入格式

n

输出格式

把第n个斐波那契数列的数分解质因数。

输入输出样例

输入 

5

输出 

5=5

输入 

6

输出 

8=2*2*2

说明/提示

n≤48

 

14、公交换乘    NOIP 2019 普及组 第二题

题目描述

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:

  1. 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即:tbus​−tsubway​≤45
  2. 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
  3. 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。

现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

输入格式

输入文件的第一行包含一个正整数 n,代表乘车记录的数量。

接下来的 n 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 i 行的第 1 个整数代表第 i 条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 i 条记录乘车的票价 pricei​ ;第三个整数代表第 i 条记录开始乘车的时间 ti​(距 0 时刻的分钟数)。

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。

输出格式

输出文件有一行,包含一个正整数,代表小轩出行的总花费。

输入输出样例

输入 

6
0 10 3
1 5 46
0 12 50
1 3 96
0 5 110
1 6 135

输出 

36

输入 

6
0 5 1
0 20 16
0 7 23
1 18 31
1 4 38
1 7 68 

输出 

32

说明/提示

【输入输出样例 1 说明】

第一条记录,在第 3 分钟花费 10 元乘坐地铁。

第二条记录,在第 46 分钟乘坐公交车,可以使用第一条记录中乘坐地铁获得的优惠票,因此没有花费。

第三条记录,在第 50 分种花费 12 元乘坐地铁。

第四条记录,在第 96 分钟乘坐公交车,由于距离第三条记录中乘坐地铁已超过 45 分钟,所以优惠票已失效,花费 3 元乘坐公交车。

第五条记录,在第 110 分钟花费 5 元乘坐地铁。

第六条记录,在第 135 分钟乘坐公交车,由于此时手中只有第五条记录中乘坐地铁获得的优惠票有效,而本次公交车的票价为 6 元,高于第五条记录中地铁的票价 5 元,所以不能使用优惠票,花费 6 元乘坐公交车。

总共花费 36 元。

【输入输出样例 2 说明】

第一条记录,在第 1 分钟花费 5 元乘坐地铁。

第二条记录,在第 16 分钟花费 20 元乘坐地铁。

第三条记录,在第 23 分钟花费 7 元乘坐地铁。

第四条记录,在第 31 分钟乘坐公交车,此时只有第二条记录中乘坐的地铁票价高于本次公交车票价,所以使用第二条记录中乘坐地铁获得的优惠票。

第五条记录,在第 38 分钟乘坐公交车,此时第一条和第三条记录中乘坐地铁获得的优惠票都可以使用,使用获得最早的优惠票,即第一条记录中乘坐地铁获得的优惠票。

第六条记录,在第 68 分钟乘坐公交车,使用第三条记录中乘坐地铁获得的优惠票。

总共花费 32 元。

【数据规模与约定】

对于 30% 的数据,n≤1000,t_i \leq 10^6ti​≤106。

另有 15% 的数据, ti​≤10^7,pricei​ 都相等。

另有15% 的数据,ti​≤10^9,pricei​ 都相等。

对于 100% 的数据,n≤10^5,ti​≤10^9,1≤pricei​≤1000。

15、奖学金    NOIP 2007 普及组 第一题

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7    279
5    279

这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5   279
7   279

则按输出错误处理,不能得分。

输入格式

共n+1行。

第1行为一个正整数n(≤300),表示该校参加评选的学生人数。

第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第jj行的3个数字依次表示学号为j−1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。

所给的数据都是正确的,不必检验。

输出格式

共5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。

输入输出样例

输入 

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出 

6 265
4 264
3 258
2 244
1 237

输入 

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出 

8 265
2 264
6 264
1 258
5 258

 

16、机器翻译    NOIP 2010 提高组 第一题

题目背景

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

题目描述

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有 M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入 M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

假设一篇英语文章的长度为 N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

输入格式

共 2 行。每行中两个数之间用一个空格隔开。

第一行为两个正整数 M,N,代表内存容量和文章的长度。

第二行为 N个非负整数,按照文章的顺序,每个数(大小不超过 1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出格式

一个整数,为软件需要查词典的次数。

输入输出样例

输入 

3 7
1 2 1 5 4 4 1

输出 

5

说明/提示

样例解释

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:

  1. 1:查找单词 1 并调入内存。
  2. 1 2:查找单词 2 并调入内存。
  3. 1 2:在内存中找到单词 1。
  4. 1 2 5:查找单词 5 并调入内存。
  5. 2 5 4:查找单词 4 并调入内存替代单词 1。
  6. 2 5 4:在内存中找到单词 4。
  7. 5 4 1:查找单词 1 并调入内存替代单词 2。

共计查了 5 次词典。

数据范围

  • 对于 10% 的数据有M=1,N≤5;
  • 对于 100% 的数据有 1≤M≤100,1≤N≤1000。

 

17、玩具谜题    NOIP 2016 提高组 第一题

题目描述

小南有一套可爱的玩具小人, 它们各有不同的职业。

有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:

这时singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小人的右数第1个玩具小人的左数第2个玩具小人那里。 ”

小南发现, 这个谜题中玩具小人的朝向非常关键, 因为朝内和朝外的玩具小人的左右方向是相反的: 面朝圈内的玩具小人, 它的左边是顺时针方向, 右边是逆时针方向; 而面向圈外的玩具小人, 它的左边是逆时针方向, 右边是顺时针方向。

小南一边艰难地辨认着玩具小人, 一边数着:

singer朝内, 左数第3个是archer。

archer朝外,右数第1个是thinker。

thinker朝外, 左数第2个是writer。

所以眼镜藏在writer这里!

虽然成功找回了眼镜, 但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜, 或是谜題的长度更长, 他可能就无法找到眼镜了 。 所以小南希望你写程序帮他解决类似的谜題。 这样的谜題具体可以描述为:

有 nn个玩具小人围成一圈, 已知它们的职业和朝向。现在第1个玩具小人告诉小南一个包含m条指令的谜題, 其中第 z条指令形如“左数/右数第s,个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。

输入格式

输入的第一行包含两个正整数 n,m,表示玩具小人的个数和指令的条数。

接下来 n 行,每行包含一个整数和一个字符串,以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0 表示朝向圈内,1 表示朝向圈外。 保证不会出现其他的数。字符串长度不超过 10 且仅由小写字母构成,字符串不为空,并且字符串两两不同。整数和字符串之间用一个空格隔开。

接下来 m 行,其中第 i 行包含两个整数 ai​,si​,表示第 i 条指令。若 ai​=0,表示向左数 si​ 个人;若 ai​=1,表示向右数 si​ 个人。 保证 ai​ 不会出现其他的数,1≤si​<n。

输出格式

输出一个字符串,表示从第一个读入的小人开始,依次数完 m 条指令后到达的小人的职业。

输入输出样例

输入 

7 3
0 singer
0 reader
0 mengbier 
1 thinker
1 archer
0 writer
1 mogician 
0 3
1 1
0 2

输出 

writer

输入 

10 10
1 C
0 r
0 P
1 d
1 e
1 m
1 t
1 y
1 u
0 V
1 7
1 1
1 4
0 5
0 3
0 1
1 6
1 2
0 8
0 4

输出 

y

说明/提示

【样例1说明】

这组数据就是【题目描述】 中提到的例子。

【子任务】

子任务会给出部分测试数据的特点。 如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

其中一些简写的列意义如下:

• 全朝内: 若为“√”, 表示该测试点保证所有的玩具小人都朝向圈内;

全左数:若为“√”,表示该测试点保证所有的指令都向左数,即对任意的

1≤z≤m,ai​=0;

s=1:若为“√”,表示该测试点保证所有的指令都只数1个,即对任意的

1≤z≤m,si​=1;

职业长度为1 :若为“√”,表示该测试点保证所有玩具小人的职业一定是一个

长度为1的字符串。

 

18、花生采摘    NOIP 2004 普及组 第二题   

题目描述

鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”。

鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”

我们假定多多在每个单位时间内,可以做下列四件事情中的一件:

  1.  从路边跳到最靠近路边(即第一行)的某棵花生植株;
    
  2.  从一棵植株跳到前后左右与之相邻的另一棵植株;
    
  3.  采摘一棵植株下的花生;
    
  4.  从最靠近路边(即第一行)的某棵花生植株跳回路边。
    

现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。

例如在图2所示的花生田里,只有位于(2,5),(3,7),(4,2),(5,4)的植株下长有花生,个数分别为13,7,15,9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。

输入格式

第一行包括三个整数M,N和K,用空格隔开;表示花生田的大小为M×N(1≤M,N≤20),多多采花生的限定时间为K(0≤K≤1000)个单位时间。接下来的MM行,每行包括NN个非负整数,也用空格隔开;第i+1行的第j个整数Pij​(0≤Pij​≤500)表示花生田里植株((i,j)下花生的数目,0表示该植株下没有花生。

输出格式

一个整数,即在限定时间内,多多最多可以采到花生的个数。

输入输出样例

输入 

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

输出 

37

输入 

6 7 20
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

输出 

28

说明/提示

 

 

19、生活大爆炸版石头剪刀布    NOIP 2014 提高组 第一题

题目描述

石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。

升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

斯波克:《星际迷航》主角之一。

蜥蜴人:《星际迷航》中的反面角色。

这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。

现在,小 A小 B尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 6 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-......”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为 5 的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-......”

已知小 A小 B 一共进行 NN 次猜拳。每一次赢的人得 1 分,输的得 0 分;平局两人都得 0 分。现请你统计 N 次猜拳结束之后两人的得分。

输入格式

第一行包含三个整数:N,NA​,NB​,分别表示共进行 N次猜拳、小 A出拳的周期长度,小 B 出拳的周期长度。数与数之间以一个空格分隔。

第二行包含 NA​ 个整数,表示小 A出拳的规律,第三行包含 NB​ 个整数,表示小 B 出拳的规律。其中,0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。数与数之间以一个空格分隔。

输出格式

输出一行,包含两个整数,以一个空格分隔,分别表示小 A小 B的得分。

输入输出样例

输入 

10 5 6
0 1 2 3 4
0 3 4 2 1 0

输出 

6 2

输入 

9 5 5
0 1 2 3 4
1 0 3 2 4

输出 

4 4

说明/提示

对于100%的数据,0<N≤200,0<NA​≤200,0<NB​≤200 。

 

20、积木大赛    NOIP 2013 提高组 第一题

题目描述

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi​。

在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l,r],然后将第第L块到第 R 块之间(含第L块和第 R块)所有积木的高度分别增加1。

小M是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入格式

包含两行,第一行包含一个整数n,表示大厦的宽度。

第二行包含n个整数,第i个整数为hi​。

输出格式

建造所需的最少操作数。

输入输出样例

输入 

5
2 3 4 1 2

输出 

5

说明/提示

【样例解释】

其中一种可行的最佳方案,依次选择

[1,5][1,3] [2,3] [3,3] [5,5]

【数据范围】

对于30%的数据,有1≤n≤10;

对于 70%的数据,有1≤n≤1000;

对于 100%的数据,有1≤n≤100000,0≤hi​≤10000。

 

 

21、无线网络发射器选址    NOIP 2014  提高组 第一题

题目描述

随着智能手机的日益普及,人们对无线网的需求日益增大。某城市决定对城市内的公共场所覆盖无线网。

假设该城市的布局为由严格平行的 129 条东西向街道和 129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1。东西向街道从北到南依次编号为 0,1,2…128,南北向街道从西到东依次编号为 0,1,2…128。

东西向街道和南北向街道相交形成路口,规定编号为 x 的南北向街道和编号为 y 的东西向街道形成的路口的坐标是 (x,y)。在某些路口存在一定数量的公共场所。

由于政府财政问题,只能安装一个大型无线网络发射器。该无线网络发射器的传播范围是一个以该点为中心,边长为 2d 的正方形。传播范围包括正方形边界。

现在政府有关部门准备安装一个传播参数为 d的无线网络发射器,希望你帮助他们在城市内找出合适的路口作为安装地点,使得覆盖的公共场所最多。

输入格式

第一行包含一个整数 d,表示无线网络发射器的传播距离。

第二行包含一个整数 n,表示有公共场所的路口数目。

接下来 n 行,每行给出三个整数 x,y,k,中间用一个空格隔开,分别代表路口的坐标 (x,y) 以及该路口公共场所的数量。同一坐标只会给出一次。

输出格式

输出一行,包含两个整数,用一个空格隔开,分别表示能覆盖最多公共场所的安装地点方案数,以及能覆盖的最多公共场所的数量。

输入输出样例

输入 

1  
2  
4 4 10  
6 6 20  
 

输出 

1 30

说明/提示

对于100%的数据,1≤d≤20,1≤n≤20,0≤x≤128,0≤y≤128,0<k≤1000000

 

22、分数线划定    NOIP  2009 普及组 第二题

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入格式

第一行,两个整数 n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。输入数据保证m×150%向下取整后小于等于 n。

第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000≤k≤9999)和该选手的笔试成绩s(1≤s≤100)。数据保证选手的报名号各不相同。

输出格式

第一行,有2个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含2个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

输入输出样例

输入 

6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88

输出 

88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88 

说明/提示

【样例说明】

m×150%=3×150%=4.5,向下取整后为4。保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88 的选手都可以进入面试,故最终有5个人进入面试。

 

 

23、均分纸牌    NOIP 2002  提高组 第一题

题目描述

有N堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。

移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N−1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如N=4,4堆纸牌数分别为:

①9②8③17④6

移动3次可达到目的:

从 ③ 取4张牌放到 ④ (9,8,13,10)-> 从 ③ 取3张牌放到 ②(9,11,10,10)-> 从 ② 取1张牌放到①(10,10)。

输入格式

两行

第一行为:N(N 堆纸牌,1≤N≤100)

第二行为:A1​,A2​,…,An​ (NN堆纸牌,每堆纸牌初始数,1≤Ai​≤10000)

输出格式

一行:即所有堆均达到相等时的最少移动次数。

输入输出样例

输入 

4
9 8 17 6

输出 

3

 

24、铺地毯    NOIP 2011  提高组 第一题  

题目描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 1到 n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

输入格式

输入共 n+2 行。

第一行,一个整数 n,表示总共有 n 张地毯。

接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a,b) 以及地毯在 x 轴和 y轴方向的长度。

第 n+2 行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x,y)。

输出格式

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出 -1

输入输出样例

输入 

3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

输出 

3

输入 

3
1 0 2 3
0 2 3 3
2 1 3 3
4 5

输出 

-1

说明/提示

【样例解释 1】

如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点 (2,2) 的最上面一张地毯是 3 号地毯。

【数据范围】

对于 30% 的数据,有 n≤2。
对于 50% 的数据,0≤a,b,g,k≤100。
对于 100% 的数据,有 0≤a,b,g,k≤10^5。

 

 

25、龙虎斗    NOIP 2018 普及组 第二题

题目描述

轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n 个兵营(自左至右编号 1∼n),相邻编号的兵营之间相隔 1厘米,即棋盘为长度为 n−1 厘米的线段。i 号兵营里有 ci​位工兵。 下面图 1 为 n=6 的示例:

轩轩在左侧,代表“龙”;凯凯在右侧,代表“虎”。 他们以 m 号兵营作为分界, 靠左的工兵属于龙势力,靠右的工兵属于虎势力,而第 m 号兵营中的工兵很纠结,他们不属于任何一方。

一个兵营的气势为:该兵营中的工兵数 × 该兵营到 m 号兵营的距离;参与游戏 一方的势力定义为:属于这一方所有兵营的气势之和。
下面图 2 为 n=6,m=4 的示例,其中红色为龙方,黄色为虎方:

游戏过程中,某一刻天降神兵,共有 s1​ 位工兵突然出现在了 p1​ 号兵营。作为轩轩和凯凯的朋友,你知道如果龙虎双方气势差距太悬殊,轩轩和凯凯就不愿意继续玩下去了。为了让游戏继续,你需要选择一个兵营 p2​,并将你手里的 s2​ 位工兵全部派往 兵营 p2​,使得双方气势差距尽可能小。

注意:你手中的工兵落在哪个兵营,就和该兵营中其他工兵有相同的势力归属(如果落在 m 号兵营,则不属于任何势力)。

输入格式

输入文件的第一行包含一个正整数n,代表兵营的数量。

接下来的一行包含 n 个正整数,相邻两数之间以一个空格分隔,第 i 个正整数代 表编号为 ii 的兵营中起始时的工兵数量 ci​。

接下来的一行包含四个正整数,相邻两数间以一个空格分隔,分别代表 m,p1​,s1​,s2​。

输出格式

输出文件有一行,包含一个正整数,即 p2​,表示你选择的兵营编号。如果存在多个编号同时满足最优,取最小的编号。

输入输出样例

输入 

6 
2 3 2 3 2 3 
4 6 5 2 

输出 

2

输入 

6 
1 1 1 1 1 16 
5 4 1 1

输出 

1

说明/提示

【输入输出样例 1 说明】

见问题描述中的图 2。
双方以 m=4 号兵营分界,有 s1​=5 位工兵突然出现在 p1​=6 号兵营。 龙方的气势为:

2×(4−1)+3×(4−2)+2×(4−3)=14

虎方的气势为:

2×(5−4)+(3+5)×(6−4)=18

当你将手中的 s2​=2 位工兵派往 p2​=2 号兵营时,龙方的气势变为:

14+2×(4−2)=18

此时双方气势相等。

【输入输出样例 2 说明】

双方以 m=5 号兵营分界,有 s1​=1 位工兵突然出现在 p1​=4 号兵营。
龙方的气势为:

1×(5−1)+1×(5−2)+1×(5−3)+(1+1)×(5−4)=11

虎方的气势为:

16×(6−5)=16

当你将手中的 s2​=1 位工兵派往p2​=1 号兵营时,龙方的气势变为:

11+1×(5−1)=15

此时可以使双方气势的差距最小。

【数据规模与约定】
1<m<n,1≤p1​≤n。
对于 20% 的数据,n=3,m=2,ci​=1,s1​,s2​≤100。
另有 20% 的数据,n≤10,p1​=m,ci​=1,s1​,s2​≤100。
对于 60% 的数据,n≤100,ci​=1,s1​,s2​≤100。
对于 80% 的数据,n≤100,ci​,s1​,s2​≤100。
对于 100% 的数据,ci​,s1​,s2​≤10^9。

 

26、 螺旋矩阵    NOIP 2014 普及组 第二题

题目描述

一个 n行 n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n^2,便构成了一个螺旋矩阵。

下图是一个 n=4 时的螺旋矩阵。

 1     2     3     4
12    13    14     5
11    16    15     6
10     9     8     7

现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。

输入格式

共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

输出格式

一个整数,表示相应矩阵中第 i 行第 j 列的数。

输入输出样例

输入 

4 2 3

输出 

14

说明/提示

【数据说明】

对于 50% 的数据,1⩽n⩽100;

对于 100% 的数据,1⩽n⩽30,000,1⩽i⩽n,1⩽j⩽n。

 

27、火星人    NOIP 2004 普及组 第四题  

题目描述

人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。

火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3…。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。

一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。下表展示了只有3根手指时能够形成的6个3位数和它们代表的数字:

三进制数

123
132
213
231
312    321

代表的数字

1
2
3
4
5
6

现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

输入格式

共三行。
第一行一个正整数N,表示火星人手指的数目(1≤N≤10000)。
第二行是一个正整数M,表示要加上去的小整数(1≤M≤100)。
下一行是1到N这N个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。

输出格式

N个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。

输入输出样例

输入 

5
3
1 2 3 4 5

输出 

1 2 4 5 3

说明/提示

对于30%的数据,N≤15;

对于60%的数据,N≤50;

对于全部的数据,N≤10000;

 

 

28、瑞士轮    NOIP 2011 普及组 第三题  

题目背景

在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。

本题中介绍的瑞士轮赛制,因最早使用于1895年在瑞士举办的国际象棋比赛而得名。它可以看作是淘汰赛与循环赛的折中,既保证了比赛的稳定性,又能使赛程不至于过长。

题目描述

2×N 名编号为 1∼2N 的选手共进行R 轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。

每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1 名和第2 名、第 3 名和第 4名、……、第2K−1名和第2K名、…… 、第2N−1名和第2N名,各进行一场比赛。每场比赛胜者得1分,负者得 0分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。

现给定每个选手的初始分数及其实力值,试计算在R 轮比赛过后,排名第Q 的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。

输入格式

第一行是三个正整数N,R,Q,每两个数之间用一个空格隔开,表示有 2×N名选手、R 轮比赛,以及我们关心的名次 Q。

第二行是2×N 个非负整数s1​,s2​,…,s2N​,每两个数之间用一个空格隔开,其中si​表示编号为i 的选手的初始分数。 第三行是2×N 个正整数w1​,w2​,…,w2N​,每两个数之间用一个空格隔开,其中 wi​ 表示编号为i 的选手的实力值。

输出格式

一个整数,即R 轮比赛结束后,排名第Q 的选手的编号。

输入输出样例

输入 

2 4 2 
7 6 6 7 
10 5 20 15 

输出 

1

说明/提示

【样例解释】

【数据范围】

对于30%的数据,1≤N≤100;

对于50%的数据,1≤N≤10,000;

对于100%的数据,1≤N≤100,000,1≤R≤50,1≤Q≤2N,0≤s1​,s2​,…,s2N​≤108,1≤w1​,w2​,…,w2N​≤10^8。

 

 

29、转圈游戏    NOIP 2013 提高组 第一题

题目描述

n 个小伙伴(编号从 0到 n−1)围坐一圈玩游戏。按照顺时针方向给 n个位置编号,从0 到 n−1。最初,第 0号小伙伴在第 0号位置,第 1号小伙伴在第 1 号位置,……,依此类推。游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第m 号位置,第 1号位置小伙伴走到第 m+1 号位置,……,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第n∼m+1 号位置上的小伙伴走到第1 号位置,……,第n−1 号位置上的小伙伴顺时针走到第m−1 号位置。

现在,一共进行了 10^k轮,请问x 号小伙伴最后走到了第几号位置。

输入格式

共1行,包含 4 个整数n,m,k,x,每两个整数之间用一个空格隔开。

输出格式

1个整数,表示 10k轮后 x 号小伙伴所在的位置编号。

输入输出样例

输入 

10 3 4 5

输出 

5

说明/提示

对于 30%的数据,0<k<7;

对于 80\%80%的数据,0 < k < 10^7;

对于100%的数据,1 <n < 1,000,000,   0 < m < n,1 ≤ x ≤ n,0 < k < 10^9。

 

30、传球游戏  2008普及组第三题

题目描述

上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

输入格式

一行,有两个用空格隔开的整数n,m(3≤n≤30,1≤m≤30)。

输出格式

1个整数,表示符合题意的方法数。

输入输出样例

输入 

3 3

输出 

2

说明/提示

40%的数据满足:3≤n≤30,1≤m≤20

100%的数据满足:3≤n≤30,1≤m≤30

 

31、 摆花   NOIP 2012 普及组 第三题

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mm盆。通过调查顾客的喜好,小明列出了顾客最喜欢的nn种花,从11到nn标号。为了在门口展出更多种花,规定第ii种花不能超过a_iai​盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

试编程计算,一共有多少种不同的摆花方案。

输入格式

第一行包含两个正整数n和m,中间用一个空格隔开。

第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1​,a2​,…,an​。

输出格式

一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。

输入输出样例

输入 

2 4
3 2

输出 

2

说明/提示

【数据范围】

对于20%数据,有0<n≤8,0<m≤8,0≤ai​≤8;

对于50%数据,有0<n≤20,0<m≤20,0≤ai​≤20;

对于100%数据,有0<n≤100,0<m≤100,0≤ai​≤100。

 

32、导弹拦截    NOIP 2010 普及组 第二题

题目描述

经过 11年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 0时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。

某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。

输入格式

第一行包含 4个整数x1​、y1​、x2​、y2​,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x1​,y1​)、(x2​,y2​)。 第二行包含1 个整数N,表示有 N颗导弹。接下来N行,每行两个整数 x,y,中间用 一个空格隔开,表示一颗导弹的坐标(x,y)。不同导弹的坐标可能相同。

输出格式

一个整数,即当天的最小使用代价。

输入输出样例

输入 

0 0 10 0
2
-3 3
10 0

输出 

18

输入 

0 0 6 0
5
-4 -2
-2 3
4 0
6 -2
9 1

输出 

30

说明/提示

两个点((x1​,y1​)、(x2​,y2​)之间距离的平方是(x1​−x2​)2+(y1​−y2​)^2。

两套系统工作半径r1​,r2​的平方和,是指 r1​,r2​ 分别取平方后再求和,即 r1^2​+r2^2​。

【样例 1说明】

样例1中要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为18和0。

【样例2说明】

样例2中的导弹拦截系统和导弹所在的位置如下图所示。要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为20 和10。

【数据范围】

对于10%的数据,N=1

对于20%的数据,1≤N≤2

对于40%的数据,1≤N≤100

对于70%的数据,1≤N≤1000

对于100%的数据,1≤N≤100000,且所有坐标分量的绝对值都不超过1000。

 

33、 Jam的计数法   NOIP 2006 普及组 第三题

题目描述

Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。

在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为JamJam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用b,c,d,e,f,g,h,i,j这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示JamJam数字“bdfij”与“bdghi”,则U<V,且不存在Jam数字P,使U<P<V)。

你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。

输入格式

共2行。

第1行为3个正整数,用一个空格隔开:stw (其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T≤26,2≤w≤t−s )

第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。

所给的数据都是正确的,不必验证。

输出格式

最多为5行,为紧接在输入的Jam数字后面的55个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。

输入输出样例

输入 

  2 10 5
  bdfij

输出 

bdghi
bdghj
bdgij
bdhij
befgh

 

 

 

34、海港    NOIP 2016 普及组 第二题

题目描述

小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘 客数k_iki​,以及每名乘客的国籍 xi,1​,xi,2​,…,xi,k​。

小K统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算nn条信息。对于输出的第ii条信息,你需要统计满足ti​−86400<tp​≤ti​的船只p,在所有的xp,j​中,总共有多少个不同的数。

输入格式

第一行输入一个正整数nn,表示小K统计了n艘船的信息。

接下来n行,每行描述一艘船的信息:前两个整数ti​和ki​分别表示这艘船到达海港的时间和船上的乘客数量,接下来ki​个整数x_{i,j}xi,j​表示船上乘客的国籍。

保证输入的t_iti​是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第t_iti​秒到达海港。

保证 1 \le n \le 10^51≤n≤105,\sum{ki} \le 3*10^5∑ki≤3∗105 ,1\le x(i,j) \le 10^51≤x(i,j)≤105, 1 \le t(i-1)\le ti \le 10^91≤t(i−1)≤ti≤109。

其中\sum{ki}∑ki表示所有的k_iki​的和。

输出格式

输出nn行,第ii行输出一个整数表示第ii艘船到达后的统计信息。

输入输出样例

输入 

3
1 4 4 1 2 2
2 2 2 3
10 1 3

输出 

3
4
4

输入 

4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5

输出 

3
3
3
4

说明/提示

【样例解释1】

第一艘船在第1秒到达海港,最近24小时到达的船是第一艘船,共有4个乘客, 分别是来自国家4,1,2,2,共来自3个不同的国家;

第二艘船在第2秒到达海港,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家4,1,2,2,2,3,共来自4个不同的国家;

第三艘船在第10秒到达海港,最近24小时到达的船是第一艘船、第二艘船和第 三艘船,共有4+2+1=7个乘客,分别是来自国家4,1,2,2,2,3,3,共来自4个不同 的国家。

【样例解释2】

第一艘船在第1秒到达海港,最近24小时到达的船是第一艘船,共有4个乘客,分别是来自国家1,2,2,3,共来自3个不同的国家。

第二艘船在第3秒到达海港,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家1,2,2,3,2,3,共来自3个不同的国家。

第三艘船在第86401秒到达海港,最近24小时到达的船是第二艘船和第三艘船,共有2+2=4个乘客,分别是来自国家2,3,3,4,共来自3个不同的国家。

第四艘船在第86402秒到达海港,最近24小时到达的船是第二艘船、第三艘船和第四艘船,共有2+2+1=5个乘客,分别是来自国2,3,3,4,5,共来自44个不同的国家。

【数据范围】

 

35、寻宝   NOIP 2012 普及组 第二题

题目描述

传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。说明书的内容如下:

藏宝楼共有N+1N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有NN层,每层MM个房间,这MM个房间围成一圈并按逆时针方向依次编号为0,…,M-10,…,M−1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字xx,表示从这个房间开始按逆时针方向选择第xx个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的kk号房间。比如当前房间的指示牌上写着22,则按逆时针方向开始尝试,找到第22个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。

寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。

请帮助小明算出这个打开宝箱的密钥。

输入格式

第一行2个整数N和M,之间用一个空格隔开。N表示除了顶层外藏宝楼共N层楼,M表示除顶层外每层楼有M个房间。

接下来N×M行,每行两个整数,之间用一个空格隔开,每行描述一个房间内的情况,其中第(i−1)×M+j行表示第i层j-1j−1号房间的情况(i=1,2,…, Ni=1,2,…,N;j=1,2,…,Mj=1,2,…,M)。第一个整数表示该房间是否有楼梯通往上一层(0表示没有,1表示有),第二个整数表示指示牌上的数字。注意,从jj号房间的楼梯爬到上一层到达的房间一定也是jj号房间。

最后一行,一个整数,表示小明从藏宝楼底层的几号房间进入开始寻宝(注:房间编号从0开始)。

输出格式

一个整数,表示打开宝箱的密钥,这个数可能会很大,请输出对20123取模的结果即可。

输入输出样例

输入 

2 3
1 2
0 3
1 4
0 1
1 5
1 2
1

输出 

5

说明/提示

【数据范围】

对于50%数据,有0<N≤1000,0<x≤10000;
对于100%数据,有0<N≤10000,0<M≤100,0<x≤1,000,000。

 

36、作业调度方案    NOIP 2006 提高组 第三题

题目描述

我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。

每个工件的每个工序称为一个操作,我们用记号j-k表示一个操作,其中j为1到n中的某个数字,为工件号;k为1到m中的某个数字,为工序号,例如2-4表示第2个工件第4道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。

例如,当n=3,m=2时,1-1,1-2,2-1,3-1,3-2,2-2 就是一个给定的安排顺序,即先安排第1个工件的第11个工序,再安排第1个工件的第2个工序,然后再安排第2个工件的第1个工序,等等。

一方面,每个操作的安排都要满足以下的两个约束条件。

  1. 对同一个工件,每道工序必须在它前面的工序完成后才能开始;

  2. 同一时刻每一台机器至多只能加工一个工件。

另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。

由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“112332”。

还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。

例如,取n=3,m=2,已知数据如下(机器号/加工时间):

工件号工序11工序22
111/31/32/22/2
221/21/22/52/5
332/22/21/41/4

则对于安排顺序“1 1 2 3 3 2112332”,下图中的两个实施方案都是正确的。但所需要的总时间分别是1010与1212。

当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在保证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。于是,在这些约定下,上例中的方案一是正确的,而方案二是不正确的。

显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。

输入格式

第1行为两个正整数 m, n,用一个空格隔开, (其中m(<20)表示机器数,n(<20)表示工件数)

第2行:m×n 个用空格隔开的数,为给定的安排顺序。

接下来的2n行,每行都是用空格隔开的mm个正整数,每个数不超过20。

其中前n行依次表示每个工件的每个工序所使用的机器号,第1个数为第1个工序的机器号,第2个数为第2个工序机器号,等等。

后n行依次表示每个工件的每个工序的加工时间。

可以保证,以上各数据都是正确的,不必检验。

输出格式

1个正整数,为最少的加工时间。

输入输出样例

输入 

2 3
1 1 2 3 3 2
1 2 
1 2 
2 1
3 2 
2 5 
2 4

输出 

10

 

 

37、Mayan游戏    noip2011提高组  第3题

题目描述

Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个7 行×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

1 、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图1 和图2);

2 、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1 到图3)。

注意:

a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4 ,三个颜色为1 的方块和三个颜色为 2 的方块会同时被消除,最后剩下一个颜色为2的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5 所示的情形,5 个方块会同时被消除)。

3 、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。

上面图1 到图 3 给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0 ),将位于(3, 3 )的方块向左移动之后,游戏界面从图 1 变成图 2 所示的状态,此时在一竖列上有连续三块颜色为4 的方块,满足消除条件,消除连续3 块颜色为4 的方块后,上方的颜色为3 的方块掉落,形成图 3 所示的局面。

输入格式

共 6 行。

第一行为一个正整数n,表示要求游戏通关的步数。

接下来的5行,描述7×5 的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10种,从1开始顺序编号,相同数字表示相同颜色)。

输入数据保证初始棋盘中没有可以消除的方块。

输出格式

如果有解决方案,输出n行,每行包含 3 个整数x,y,g,表示一次移动,每两个整数之间用一个空格隔开,其中(x,y)表示要移动的方块的坐标,g 表示移动的方向,1 表示向右移动,−1表示向左移动。注意:多组解时,按照x为第一关健字,y为第二关健字,1优先于−1 ,给出一组字典序最小的解。游戏界面左下角的坐标为(0,0)。

如果没有解决方案,输出一行,包含一个整数−1。

输入输出样例

输入

3
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0

输出 

2 1 1
3 1 1
3 0 1

说明/提示

【输入输出样例说明】

按箭头方向的顺序分别为图6到图11

样例输入的游戏局面如上面第一个图片所示,依次移动的三步是:(2,1)处的方格向右移动,(3,1)处的方格向右移动,(3,0)处的方格向右移动,最后可以将棋盘上所有方块消除。

【数据范围】

对于30%的数据,初始棋盘上的方块都在棋盘的最下面一行;

对于100%的数据,0<n≤5 。

 

38、篝火晚会    2005提高组第三题

题目描述

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,…,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。

佳佳可向同学们下达命令,每一个命令的形式如下:

(b1​,b2​,...bm−1​,bm​)

这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1​,b2​,…,bm​的这m个同学的位置。要求b1​换到b2​的位置上,b2​换到b3​的位置上,……,要求bm​换到b1​的位置上。执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

输入格式

第一行是一个整数n(3≤n≤50000),表示一共有n个同学。

其后n行每行包括2个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。

输出格式

一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出−1。

输入输出样例

输入 

4
3 4
4 3
1 2
1 2

输出 

2

说明/提示

对于30%的数据,n≤1000;
对于全部的数据,n≤50000。

 

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模拟退火算法(Simulated Annealing, SA)是一种启发式搜索算法,主要用于求解组合优化问题。其基本思想是模拟固体在退火过程中的能量最小化现象,通过随机搜索来寻找问题的全局最优解。 C++实现模拟退火算法的步骤如下: 1. 定义目标函数,即需要求解的优化问题。 2. 初始化参数,包括初始解、初始温度、终止温度和降温系数等。 3. 在当前温度下,随机生成一个新的解,并计算新解与当前解的目标函数值差。 4. 如果新解优于当前解,则接受新解;否则以一定概率接受新解。这个概率由Metropolis准则给出,即:P(New) = exp((E(Current) - E(New)) / T),其中T为当前温度。 5. 更新当前解为新解,降低温度(乘以降温系数)。 6. 重复步骤3-5,直到满足终止条件(如温度低于某个阈值或迭代次数达到上限)。 7. 输出最优解。 以下是一个简单的C++实现模拟退火算法的示例代码: ```cpp #include <iostream> #include <cmath> #include <ctime> #include <cstdlib> using namespace std; // 目标函数 double func(double x) { return pow(x, 2) - 4 * x + 4; } int main() { srand(time(0)); double x0 = rand() % 10; // 初始解 double T = 100; // 初始温度 double T_min = 1e-8; // 终止温度 double alpha = 0.99; // 降温系数 int max_iter = 1000; // 最大迭代次数 for (int i = 0; i < max_iter; ++i) { double new_x = x0 + (rand() % 1000 - 500) / 1000 * (x0 - 2); // 新解 double E_new = func(new_x); double E_current = func(x0); if (E_new < E_current || exp((E_new - E_current) / T) > rand() / double(RAND_MAX)) { x0 = new_x; } T *= alpha; if (T < T_min) { break; } } cout << "最优解:" << x0 << endl; cout << "目标函数值:" << func(x0) << endl; return 0; } ``` 注意:这个示例代码仅适用于一维优化问题,对于多维问题,需要对目标函数和邻域操作进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值