每日编程-20170308-2

题目:给出两个自然数N和n,找到一组连续的自然数,其长度大于等于n,其和等于N。

输入:N(空格)n

输出:自然数列,每个数之间有空格,最后一个数后无空格 | 没有答案则输出:No answer

解答:

 1 #include <iostream>
 2 #include <vector>
 3 using std::cout; using std::endl; using std::cin;
 4 using std::vector;
 5
 6 int main() {
 7
 8     int N, n, sum = 0;  //sum为总和
 9     vector<int> answer;  //答案以vector形式保存,因为不确定会有多少
10     cin >> N >> n;  //输入参数
11     for (auto i = 1; i <= N/2; i++)  //遍历1到N/2,考虑到(N/2)+(N/2)+1 > N
12     {
13         for (auto j = i; sum < N ; j++)  //从i开始遍历,直到数列和不小于N
14         {
15             sum += j;
16             answer.push_back(j);
17         }
18         if (sum == N && ((answer.end() - answer.begin()) > n))  //如果sum等于N,并且answer长度大于n
19         {
20             for (auto beg = answer.begin(); beg != answer.end();beg++)  //输出answer
21             {
22                 cout << *beg;
23                 if (beg+1 != answer.end())
24                 {
25                     cout << " ";
26                 }
27             }
28             break;
29         }
30         else  //如果sum不等于N或者answer长度小于等于n
31         {
32             answer = {};  //清空答案,sum清零
33             sum = 0;
34         }
35     }
36     if (answer.begin() == answer.end())  //如果answer为空,没有答案
37     {
38         cout << "No answer" << endl;
39     }
40 }

第二版

 1 #include <iostream>
 2 #include <vector>
 3 using std::cout; using std::endl; using std::cin;
 4 using std::vector;
 5
 6 int main() {
 7
 8     int N, n, sum = 0;
 9     vector<int> answer;
10     cin >> N >> n;
11     for (auto i = 1; i <= N/n; i++)  //数学改进,n(N/n) + n-1 > n
12     {
13         for (auto j = i; sum < N ; j++)
14         {
15             sum += j;
16             answer.push_back(j);
17         }
18         if (sum == N && (answer.size() > n))   //刚才脑残了,把size忘了
19         {
20             for (auto beg = answer.begin(); beg != answer.end();beg++)
21             {
22                 cout << *beg;
23                 if (beg+1 != answer.end())
24                 {
25                     cout << " ";
26                 }
27             }
28             break;
29         }
30         else
31         {
32             answer = {};
33             sum = 0;
34         }
35     }
36     if (answer.begin() == answer.end())
37     {
38         cout << "No answer" << endl;
39     }
40 }
时间: 2024-10-11 22:58:42

每日编程-20170308-2的相关文章

每日编程-20170308

题目:从1开始到N个自然数中,0-9每个数字出险次数进行统计.(昨天做的牛客网统一考试题) 输入:N 输出要求: 输出10个数字对应的出现次数,以空格为间隔,最后一个数字后面不加空格 解答: 1 #include <iostream> 2 using std::cout; using std::endl; using std::cin; 3 int main() { 4 int c[10] = { 0 }; //初始化数组用于存放每个数字出现次数,0开始 5 int number; 6 cin

使用Github Page鼓励自己每日编程

动机 三天不练手生,编程的基础训练本身是很枯燥的,需要很多的认真与坚持.无论是Debug的经验,语法规则的记忆,还是各类基础的算法运用,都需要持之以恒的认真.Github的"打卡"以及展示页,可以作为一个小小的奖励,鼓励自己每日坚持. 方案 因为github是支持jekyll引擎的,所以使用jekyll生成项目是足够好的选择,还有新一点的工具Hexo,都能快速地在Github Pages上面搭建blog.难度上会比WordPress大一点点,但是足够geek啊.花了一个下午折腾,终于搭

每日编程素养11

JavaScript 编程题 去掉一组整型数组中重复的值. 比如输入:[1,13,24,11,11,14,1,2] 输出:[1,13,24,11,14,2] 需要去掉重复的 11 和 1 这两个元素. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script&g

每日编程-20170331

题目:给定一个递增序列,a1 <a2 <...<an .定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素.问剩余序列的最大间隔最小是多少? 输入描述: 第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列. 输出描述: 输出答案. 输入例子: 5 1 2 3 7 8 输出例子: 4 解答: 首尾不能删 有ak, ak+1, ak+2处,如果删除a

每日编程-20170327

有数量不限的硬币,币值为25分.10分.5分和1分,请编写代码计算n分有几种表示法. 给定一个int n,请返回n分有几种表示法.保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007. 测试样例:6 返回:2 解答: 硬币问题直接使用动态规划的算法,我是在这里学习的该方法,有详细的解答. 下面是我按照连接的方法写的动态规划算法. 1 #include <iostream> 2 #include <vector> 3 4 using namespace st

[每日编程]求 largest Number - 给出一组非负整数,求这些非负整数可以拼接出的最大数字

英文:Given a list of non negative integers, arrange them such that they form the largest number. 中文:给出一组非负整数,求这些非负整数可以拼接出的最大数字 说明:例如,给出数组 [3, 30, 34, 5, 9],拼接出的最大数字为9534330 正确的排序方法,是使用排序方法进行比较时,比较两个字符串(设为A和B),以先后顺序拼接而成的两个字符串A+B和B+A,如果A+B更大,则A在前B在后,否则A在

Java每日编程day2

第一题 package com.pcx.day2; /* * 九九乘法表 并逆序 */ public class JiuJiu { ????public static void main(String[] args) { ????????for (int i = 1; i < 10; i++) { ????????????for (int j = 1; j <= i; j++) { ????????????????System.out.print(j+"*"+i+"

每日编程系列———最大奇约数

一.题目 小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣.一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数. 例如:f(44) = 11. 现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21小易计算这个问题遇到了困难,需要你来设计一个算法帮助他. 输入

每日编程-20170401

题目:示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. 每一步可沿左斜线向下或右斜线向下走: 1< 三角形行数< 25: 三角形中的数字为整数< 1000: 输入第一行为N,表示有N行 后面N行表示三角形每条路的路径权 输出路径所经过的数字的总和最大的答案 样例输入 573 88 1 02 7 4 44 5 2 6 5样例输出 30 解答: DP还是不太会啊,找了个最传统的练习一下 保存三角形后,从下向上算 倒数第二行,第一个数,它的选