all about sequence

本文精选多道算法题目,涵盖序列操作、数列处理、排列转换等核心内容,旨在提供解决思路与方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并(sequence)
3.1 题目描述
给定一个序列,你每次可以合并相邻两个元素,新的元素为这两个元素的和。你需要使得若干
次合并之后的序列非降,求最小合并次数。
3.2 输入格式
第一行一个数 n,表示序列长度。
接下来一行 n个正整数,表示这个序列。
3.3 输出格式
一行一个数,表示最小合并次数。

3.4 输入样例

5

8 2 7 3 1

3.5 输出样例
3
3.6 数据范围
对于 30%的数据:n ≤ 100
对于 100%的数据:n ≤ 1500 ,序列元素大小不超过 1000 。

 

CCL的消遣(CCL)

[题目描述]

         AS we know,CCL是一个很无聊很无聊很无聊的人.有一天,CCL注意到地面上有很多棍子,于是,CCL决定用这些棍子来消磨时间(这是要有多无聊啊).

         CCL先将这些棍子排成一排.每根棍子有一个长度.CCL一次可以将2个相邻的棍子合并成一根更长的棍子,合并出的棍子的长度为原来2根棍子的长度之和(具体的过程请参考样例).CCL想用最少的合并次数来将这些棍子变成一个长度不降的序列.

[输入格式]

         输入文件的第一行有一个正整数n,表示棍子的数目.

         接下来一行n个正整数,依次表示每根木棍的长度.

[输出格式]

         输出文件一行仅一个数,表示最少的合并次数.

[样例输入]

         5

         8 2 7 3 1

[样例输出]

         3

[样例解释]

         最优方案是将后4根木棍合并,形成一个长度为13的棍子,共需要3次合并操作.

         合并后的序列为:8,13.

[数据范围]

         10%的数据,N<=1500

         20%的数据,N<=5000

         50%的数据,N<=200000

         100%的数据,N<=1000000,每根棍子的长度<=maxlongint

 

奇怪的数列(strange)
[题目描述]
春 春 碰到了 一个奇怪的数列 , 我 们 不 妨 设 他 为 a. 对 每 一 个 i>10, 都会有
ai=b1*a(i-10)+b2*(ai-9)……+b10*a(i-1).其中 b是一个给定的序列.
现在我们知道了 b 序列和 a 序列的前 10 个数,春春想要知道 a 的前若干个数的和 mod
1,000,000,007 的值.而无辜的你则被迫接受了这个任务.
[输入格式]
输入第一行有10个数,分别表示a1~a10的值.第二行有10个正整数,分别表示b1~b10的
值.接下来有若干行,每行有一个正整数 i,表示一个询问.当你的程序读到最后一个正整数时,
视作输入结束.
[输出格式]
对每个询问输出一行,表示你的程序给出的答案.
[样例输入]
1 1 2 3 5 8 13 21 34 55
0 0 0 0 0 0 0 0 1 1
1
5
14
[样例输出]
1
12
986
[数据范围]
30%的数据,i<=20
50%的数据,i<=30
100%的数据,i<=100000,且询问组数在100000 以内
[提示]
所有输入都在32 位整型范围内.
保证所有的输入数据均符合题目要求.
但不保证没有冗余数据

 

 

有趣的数列(sequence.pas/c/cpp)

【问题描述】

对于非负整数 , 的有趣数列是按照如下定义的无穷整数数列:

(1)   这个数列的第一项为x;

(2)   若数列的第n项为y ,且y为偶数,则数列的第n+1项为y/2 ;

(3)   若数列的第n项为y,且y为奇数,则数列的第n+1项为y-1 。

例如60的有趣数列为:60, 30, 15, 14, 7, 6, 3, 2, 1, 0, 0 ……

给出非负整数K,A,B,(A<=B)求在区间[A,B]内有多少个非负整数x满足x的有趣数列包含K。

你的任务是编写一个程序,回答T组这样的询问。

 

【输入】

输入文件名为sequence.in,共T+1行。

第一行包含一个正整数T(T<=200) 。

下面T行,每行包含三个非负整数K,A,B 。

 

【输出】

输出文件名为sequence.out,共T行,每行包含一个非负整数,第i行的整数表示输入中第i+1行询问的答案。

 

【输入输出样例】

sequence.in

sequence.out

2

3 4 8

13 12345 67890123

2

8387584

 

【数据说明】

对于 50%的数据满足K,A,B<=10,000;

对于 100%的数据满足K,A,B<=1018

 

Sequence (1s 256MB)

给出一个长度为N的正整数数列{An}。

你有两种变换操作:

         1.把数列中的某个数乘2。

         2.把数列中的所有数减1。

现在你需要通过最少的变换操作把这个数列中的数全部变成0。

输入:

    第一行一个N。下面N行,每行一个正整数Ai描述这个数列。

输出:

     输出一行一个正整数,表示最少的变换次数。

 SAMPLE

INPUT1

2

1

2

OUTPUT1:

3

INPUT2:

2

2

1025

OUTPUT2:

1035

 样例说明:

INPUT1:先把1变成2,再执行两次-1变换即可。

数据范围:

30%的数据满足 n<=1000; ai<=1000;

100%的数据满足 1<=n=200000 1<=ai<=10^9

 

 

 

Permutations

【问题描述】

给定两个1~n的排列A, B。每次可以把A的最后一个数取出,插入到A的任何一个位置(最前面或者任何两个数中间)。

问最少几次可以把A转化为B。

【输入格式】

第一行为一个整数,n。

第二行为1~n的一个排列,表示A。

第三行为1~n的一个排列,表示B。

【输出格式】

一个整数即最少操作次数。

【样例输入】

5

1 5 2 3 4

1 2 3 4 5

【样例输出】

3

【数据说明】

       30%:n <= 100

       50%:n <= 1000

       100%: n <= 200000

 

倒溶液(pour

【问题描述】

 在cj生物实验室的中央,摆放着一个长长的只有一排的试管架,上面顺次摆满了n支试管。因为高一的小朋友最近正在学习还原性糖的鉴定,所以老师已经在其中的若干个试管中盛放了实验试剂。实验试剂分为NaOH溶液和CuSO4溶液两种。

由于高一小朋友近来实验兴趣高涨,赶来做实验的小朋友络绎不绝。实验室老师忙得不可开交,于是整理试管架的任务就交给了倒霉的被抓来的小秋秋。
为了方便小朋友们操作,老师要求任意两个盛放同种溶液的试管中间,不能有盛放另一种溶液的试管。

由于小秋秋的一只手在『此处内容由于过分XX被和谐』,所以他仅能用剩下的一只手进行一种简单操作,那就是,把任意一个非空试管里的液体全部倒到另外一个空的试管里。

小秋秋着急去干别的事,所以他希望用最少的操作完成老师交给的任务。

注意:由于cj拥有世界上最先进的实验设备,所以任何试管壁不会产生任何残留溶液。

 【输入文件】

 输入数据包含两行

第一行包含一个整数n,代表一共有多少支试管

第二行包含n个整数,用空格分开,其中1代表NaOH,2代表CuSO4,0代表这是一个空试管

 

【输出文件】

 输出数据仅包含一个整数,表示最少需要的倾倒次数。

 【样例输入】

 6

2 1 2 1 2 0

 【样例输出】

 2

 【数据约定】

 40%:N <=40

70%:N <=1000

100%:N <=1000000

 

转载于:https://www.cnblogs.com/neayo/archive/2012/11/06/2757112.html

Sure, here's the code: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { const int N = 54; // length of page access sequence const int M = 6; // number of main memory frames const int P = 19; // page number range (0-18) // generate page access sequence randomly vector<int> page_seq; for (int i = 0; i < N; ++i) { page_seq.push_back(rand() % P); } // LRU algorithm vector<int> frames(M, -1); // initialize all frames to -1 (empty) vector<int> page_fault_seq; // record page faults int page_faults = 0; for (int i = 0; i < N; ++i) { int page = page_seq[i]; auto it = find(frames.begin(), frames.end(), page); // check if page is already in memory if (it == frames.end()) { // page fault ++page_faults; if (frames[0] == -1) { // there is an empty frame frames[0] = page; } else { // no empty frame, need to evict the least recently used page int lru_page = frames.back(); // the last page in the frames is the LRU page frames.pop_back(); frames.insert(frames.begin(), page); // insert the new page at the front page_fault_seq.push_back(lru_page); } } else { // page hit frames.erase(it); frames.insert(frames.begin(), page); // move the page to the front } } // output results cout << "Page replacement sequence: "; for (auto p : page_fault_seq) { cout << p << " "; } cout << endl; cout << "Page fault rate: " << static_cast<double>(page_faults) / N << endl; return 0; } ``` Explanation: - We first generate a page access sequence of length 54 using a random function. We assume that the page number range is 0-18. - We then implement the LRU algorithm for page replacement on the above access sequence. We use a vector `frames` to represent the main memory frames, and initialize all frames to -1 (empty). We also use a vector `page_fault_seq` to record the page replacement sequence (i.e., the pages that are evicted from memory due to page faults). - For each page in the access sequence, we check if it is already in memory. If it is, we move it to the front of `frames` (since it is the most recently used page). If it is not, we check if there is an empty frame. If there is, we simply put the page in that frame. If there is not, we evict the least recently used page (which is the last page in `frames`), and put the new page in the front of `frames`. We also record the evicted page in `page_fault_seq`. - After processing the entire access sequence, we output the page replacement sequence and the page fault rate. Note that the page fault rate may vary each time you run the program due to the randomness of the page access sequence.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值