懵逼中…我觉得我投这个完全就是感受一下编程题嘛…
测试什么的,以前可从来都没做过…在这里上一下两道编程题
[编程题|20分] 买苹果
时间限制:1秒
空间限制:32768K
题目描述:
小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。
可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。
如果不能购买恰好n个苹果,小易将不会购买。
输入描述:
输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果
输出描述:
输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1
输入样例:
20
输出样例:
3
解析:题目没什么难点,数据量很小,暴力可过。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <iostream> using namespace std; int Ans[101]; //预处理 void Begin() { //处理所有的值 for(int i = 1; i <= 100; i++) { Ans[i] = 32768; //根据6个苹果装的 - 判断8个苹果装的数量 for(int j6 = 0; j6 <= i/6; j6++) { int others = i - j6*6; if(others%8 == 0) { int all = j6 + others/8; if(Ans[i] > all) { Ans[i] = all; } } } if(Ans[i] == 32768) { Ans[i] = -1; } } } int main() { Begin(); int num; while(cin >> num) { cout << Ans[num] << endl; } } |
[编程题|20分] 最大的奇约数
时间限制:1秒
空间限制:32768K
题目描述:
大的奇约数
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题:
定义函数 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
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)
输出描述:
输出一个整数,即为f(1) + f(2) + f(3)…….f(N)
输入样例:
7
输出样例:
21
解析:
这个题目数据量是给的挺大的,第一反应应该是打表 – 后来一想,数据量太大,打表也过不了。
然后,递推 – 等等很多。最后想了下,肯定是有公式的。
那么公式是什么呢…我们先来对这串数据解析一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16……
首先对于奇数 – 是可以直接拿出来的…1 3 5 7 9 11 13 15 ……
然后对于剩下的偶数 2 4 6 8 10 12 14 16……对他们做除2处理得到:
1 2 3 4 5 6 7 8 ……
然后再对于奇数直接拿出来: 1 3 5 7… 偶数:2 4 6 8 …然后除2:1 2 3 4
然后再奇数拿出来 1 3… 偶数除2: 1 2…奇数拿出来1… 偶数除2 :1…
神奇!然后我们再看看这些值是多少:
1 3 5 7 9 11 13 15 …… 1 3 5 7 9 11 13 15(2)
1 3 5 7… 2 6 10 14(4)
1 3… 4 12(8)
1… 8(?)
1… 16(?)
把这些值加起来恰好就是我们要的值了…我在右边列出了他们的来源。
然后我在括号里列出了他们的公差…
嗯,懂了吧?还不懂?那就看代码:
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 |
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; int main() { LL N; LL Ans = 0; while(cin >> N) { Ans = 0; //1 2 4 8 16 倍数 for(LL i = 1; i<= N; i*=2) { LL Num = (N-i)/(2*i) + 1; //cout << "Test-"<< Num << endl; Ans += (Num * Num); } cout << Ans << endl; } return 0; } |
//刚才又调试了一下 – 发现数据不全,我修改过了才是正确的…尴尬了。
上面的代码是最后本地调试的,但是我确定是正确的。提交的代码有点问题,但是却AC了…