Jam的计数法 解题报告
这题我用的深搜,写来写去都觉得特别麻烦,干脆把从a到b的所有可能都计算出来,然后判断是否比输入的大,是就输出,让计数器加一,到五就退出程序,等下还优化试下,先把这个的代码贴上来。
C语言:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a, b;
int n;
char tmp[27];
char str[27];
int count;
void srch(int now)
{
int i;
i[......]
开心的金明 解题报告
这题可以说就是01背包的例题,我没什么多余的解释,上代码:
C语言:
#include <stdio.h>
#define max(a, b) ((a)>(b)?(a):(b))
int f[30000];
int main(void)
{
int n, m;
int i, j;
int a, b;
scanf(%d%d, &n, &m);
for(i = 0; i < m; i++){
scanf(%d%d, &a, &b);
for(j[......]
明明的随机数 解题报告
这题不难,不过我看到大部分的人都是使用的先用快排再去重,有些人是先去重再用快排,我这里就用的是哈希排序,能够以线性时间(O(n))对所有数据实现排序和去重。
没什么好解释的,1~1000,把对应的数字放到相应的数组中就可以了。
#include <stdio.h>
char bucket[1001];
int main(void)
{
int i, t;
int n, ans = 0;
scanf(%d, &n);
for(i = 0; i < n; i++){
scanf(%[......]
NOIP_2002.PJ1:级数求和 解题报告
这题网上没找到较好的算法(数学方法),只好自己写暴力版本的了。。。这题真的不好做什么报告,提交就是。
#include <stdio.h>
int main(void)
{
double n;
int i;
double ans = 0;
scanf(%lf, &n);
for(i = 1; ans <= n; i++){
ans += (double)1.0 / i;
}
printf(%d\\n, i - 1);
return 0;
}
[……]
NOIP_2001.PJ2:最大公约数与最小公倍数问题 解题报告
看到这个题目,不知道怎么做,到网上搜了下最小公倍数和最大公约数之间的公式,就找到了思路,p q = x0 y0..那么我就枚举所有的p,然后求出q,再判断之间的最大公约数是不是x0,就Ok了。
#include <stdio.h>
int gcd(int x, int y)
{
int t;
while(y > 0){
t = x % y;
x = y;
y = t;
}
return x;
}
int main(void)
{
int i, ans = 0; //忘记初始[......]
NOIP_2001.PJ4:装箱问题 解题报告
什么都不说了,简单的DP,直接上代码。
唯一注意的一点,我不是用的剩余做DP值,而是和普通的DP一样,最后再用总质量剪掉这个DP值。
C语言:
#include <stdio.h>
#define max(a, b) ((a)>(b)?(a):(b))
int f[20001];
int main(void)
{
int i, j, t;
int v, m;
scanf(%d%d, &v, &m);
for(i = 0; i < m; i++){
scanf(%[......]
NOIP_2001.PJ3:求先序排列 解题报告
在车上想了好久,终于找到了突破口,后序遍历不就是说最后一个节点就是当前书的根节点吗?那不就好说了,先把后序中的最后一个节点在中序中找到下标i,那小于i的便是左子树了,大于的的便是右子树了,而题目要的是先序,那就先把第i个(即后序的最后一个)输出来,然后再分别对左子树和右子树进行递归,然后后序从0~i-1都是左子树,后序i~len – i – 1(len是树的长度)是右子树。
现在解释一下,0~i-1是后序的长度的原因是无论是先序还是后序还是中序都是同一棵树,长度必然相同,现在把一棵树分成了两棵树,长度一定还是相同的[……]
NOIP_2001.PJ1:数的计数 解题报告
刚看到题目被吓到了,下面有一个Hit(提示),说用高精度,高精度我以前写过一次,几乎忘干净了……后来琢磨了好久,发现能够使用动态规划,注意观察一下样例,输入是6,共有:
6
16
26
126
36
136
设f[i]是以自然数i在最左边的个数,那么很容易发现方程f[i] = f[1] + f[2] + f[3] + …. + f[i/2] + 1;于是就产生了下面的代码:
C语言:
#include <stdio.h>
unsigned f[1001];
int main(void)
{[......]