[Swust OJ 403]--集合删数

题目链接:http://acm.swust.edu.cn/problem/403/

Time limit(ms): 5000        Memory limit(kb): 65535

Description

一个集合有如下元素:1是集合元素;若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。 
注:不存在所有数被删除的情况

Input

输入的仅一行,K,M的值,K,M均小于等于30000。

Output

输出为两行,第一行为删除前的数字,第二行为删除后的数字。

Sample Input

5 4

Sample Output


137915

95

解题思路:处理的不好的话就坑爹了,为了int转换string方便偷懒,百度了sstream头文件用法,也算学到了~~~~

     (1)利用题中集合信息得到最小的几个数字

     (2)sstream,int 转换为string的到待删除序列

     (3)贪心---得到删除后的最大数值

代码如下(略搓):

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <sstream>//int 转 string
 6 using namespace std;
 7 typedef long long LL;
 8 int main(){
 9     int len, m, front, cnt, end;
10     LL x[60010] = { 0, 1 }, a, b;
11     while (cin >> len >> m){
12         int i = 1, j = 1, k;
13         for (k = 2; k <= len; k++){
14             a = x[i] * 2 + 1;
15             b = x[j] * 4 + 5;
16             if (a > b){
17                 j++;
18                 x[k] = b;
19             }
20             else if (a == b){
21                 i++;
22                 j++;
23                 x[k] = a;
24             }
25             else{
26                 i++;
27                 x[k] = a;
28             }
29         }
30         string s = "", ans = "";
31         for (i = 1; i <= len; i++){
32             stringstream ss;
33             string str;
34             ss << x[i];
35             ss >> str;
36             s += str;
37         }
38         cout << s << endl;
39         string::iterator it = s.begin();
40         s.insert(it, ‘9‘);//有效序列从1开始,防止front越界
41         len = s.size();
42         front = cnt = 0, end = 1;
43         while (end <= len && cnt != m){
44             if (s[end] <= s[front])
45                 s[++front] = s[end++];
46             else{
47                 front--;
48                 cnt++;
49             }
50         }
51         while (end <= len)
52             s[++front] = s[end++];
53         for (i = 1; i < len - m; i++)
54             cout << s[i];
55         cout << endl;
56     }
57     return 0;
58 }

时间: 2024-12-09 17:53:49

[Swust OJ 403]--集合删数的相关文章

集合删数 (vijos 1545) 题解

[问题描述] 一个集合有如下元素:1是集合元素:若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字. 注:不存在所有数被删除的情况. [样例输入] 5 4 [样例输出] 137915 95 [解题思路] 首先,我们可以将该问题转化为两个子问题: 1:求2*p+1与4*p+5两个集合中前k个数组成的数. 2:求如何删去m个数字使留下的数最大

[Swust OJ 632]--集合运算(set容器)

题目链接:http://acm.swust.edu.cn/problem/632/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 集合的运算就是用给定的集合去指定新的集合.设A和B是集合,则它们的并差交补集分别定义如下: A∪B={x|x∈A∨x∈B} A∩B={x|x∈A∧x∈B} A – B={x|x∈A∧x不属于 B} SA ={x|x∈(A∪B)∧x 不属于A} SB ={x|x∈(A∪B)∧x 不属于B} Input

swust oj 1026--Egg pain&#39;s hzf

题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf is crazy about reading math recently,and he is thinking about a boring problem. Now there are n integers Arranged in a line.For each integer,he wants to know

SWUST OJ Euclid&#39;s Game(0099)

Euclid's Game(0099) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1855 Accepted: 589 Description Starts with two unequal positive numbers (M,N and M>N) on the board. Two players move in turn. On each move, a player has to write on the boar

[来源不详]删数方案数

Description 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数. Input 第一行 n 个正整数 以下有 n行,每行1个 正整数表示整数序列a Output 一个整数表示答案 Sample Input 4 1 2 3 4 Sample Output 3 Hint 30%:n<=5 100%:n<=20 100%

OJ大集合、

转载自:传送门 什么是OJ Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性. 一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等.用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序.该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足

线段树 [SWUST OJ 764] 校门外的树 Plus Plus

校门外的树 Plus Plus(0764) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 214 Accepted: 15 Description 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置,另一端在 L 的位置:数轴上的每个整数点,即 1,2,……,L,都种有一棵树. 现在要将这排树的某一段涂成某种颜色,给定 N 组区间[ 

删数方案数(regex)

[题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数. [输入文件] 第一行 n 个正整数 以下有 n行,每行1个 正整数表示整数序列a [输出文件] 一个整数表示答案 [输入样例] 4 1 2 3 4 [输出样例] 3 [数据范围] 30%:n<=5 100%:n<=20 100%:a 中每个元素<=10

[Swust OJ 404]--最小代价树(动态规划)

题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加