赞
踩
一,年龄巧合
小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是2014年,并且,小明说的年龄指的是周岁。请推断并填写出小明的出生年份。
注意甄别它表弟
- #include <stdio.h>
- int main(void)
- {
- int i=0,j=0,k=0;
- int year = 0,num=0;
- for(i=2014;1;i--,year++)
- {
- j = i;
- k = 0;
- while(j!=0)
- {
- k+=j%10;
- j/=10;
- }
- if(k==year)
- {
- num++;
- if(num==2) break;
- }
- }
- printf("%d",i);
- return 0;
- }

二,出栈次序
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
集体思路:可以总结出公式:f(3) = f(2)f(0)+f(1)f(1)+f(0)f(2)(令f(0)=1);.这个是参考了别人的,我是直接使用栈的数据结构+dfs,跑了136s出来了结果,好在结果对的。
- #include <stdio.h>
- #define M 17
- long long int a[M]={0};
- int main(void)
- {
- int i=0,j=0;
- long long int num = 16;
- a[0] = 1,a[1] = 1,a[2] = 2,a[3] = 5;
- for(i=4;i<num+1;i++)
- {
- long long int sum = 0;
- for(j = i-1;j>=0;j--) //j表示左边有多少人
- {
- sum+=a[j]*a[i-j-1]; //左边的可能性*右边的可能性
- }
- a[i] = sum;
- }
- printf("%lld",a[num]);
- return 0;
- }

三,信号匹配
从X星球接收了一个数字信号序列。
现有一个已知的样板序列。需要在信号序列中查找它首次出现的位置。这类似于串的匹配操作。
如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了。可以仿照串的KMP算法,进行无回溯的匹配。这种匹配方法的关键是构造next数组。
next[i] 表示第i项比较失配时,样板序列向右滑动,需要重新比较的项的序号。如果为-1,表示母序列可以进入失配位置的下一个位置进行新的比较。
下面的代码实现了这个功能,请仔细阅读源码,推断划线位置缺失的代码。
- // 生成next数组
- int* make_next(int pa[], int pn)
- {
- int* next = (int*)malloc(sizeof(int)*pn);
- next[0] = -1;
- int j = 0;
- int k = -1;
- while(j < pn-1){
- if(k==-1 || pa[j]==pa[k]){
- j++;
- k++;
- next[j] = k;
- }
- else
- k = next[k];
- }
-
- return next;
- }
-
- // da中搜索pa, da的长度为an, pa的长度为pn
- int find(int da[], int an, int pa[], int pn)
- {
- int rst = -1;
- int* next = make_next(pa, pn);
- int i=0; // da中的指针
- int j=0; // pa中的指针
- int n = 0;
- while(i<an){
- n++;
- if(da[i]==pa[j] || j==-1){
- i++;
- j++;
- }
- else
- __________________________; //填空位置
-
- if(j==pn) {
- rst = i-pn;
- break;
- }
- }
-
- free(next);
-
- return rst;
- }
-
- int main()
- {
- int da[] = {1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
- int pa[] = {1,2,1,1,2,1,1,1,2};
-
- int n = find(da, sizeof(da)/sizeof(int), pa, sizeof(pa)/sizeof(int));
- printf("%d\n", n);
-
- return 0;
- }

解题思路:
kmp算法详解
- #include <stdio.h>
- #include <malloc.h>
- int* make_next(int pa[], int pn)
- {
- int* next = (int*)malloc(sizeof(int)*pn);
- next[0] = -1;
- int j = 0;
- int k = -1;
- while(j < pn-1){
- if(k==-1 || pa[j]==pa[k]){ // 1,2,1,1,2,1,1,1,2
- j++;
- k++;
- next[j] = k;
- }
- else
- k = next[k];
- }
-
- return next;
- }
-
- // da中搜索pa, da的长度为an, pa的长度为pn
- int find(int da[], int an, int pa[], int pn)
- {
- int rst = -1;
- int* next = make_next(pa, pn);
- int i=0; // da中的指针
- int j=0; // pa中的指针
- int n = 0;
- while(i<an){
- n++;
- if(da[i]==pa[j] || j==-1){
- i++;
- j++;
- }
- else
- j = next[j]; //填空位置
-
- if(j==pn) {
- rst = i-pn;
- break;
- }
- }
-
- free(next);
-
- return rst;
- }
-
- int main()
- {
- int da[] = {1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
- int pa[] = {1,2,1,1,2,1,1,1,2};
-
- int n = find(da, sizeof(da)/sizeof(int), pa, sizeof(pa)/sizeof(int));
- printf("%d\n", n);
-
- return 0;
- }

四,生物芯片
X博士正在研究一种生物芯片,其逻辑密集度、容量都远远高于普通的半导体芯片。提交时,注意选择所期望的编译器类型。
解题思路:可以发现这题的关键是看一个数除去1之后还有多少个因数,大家知道完美平方数拥有奇数个因数,去除1之后还有偶数个,那么只要是完美平方数都会是暗的。
- #include <stdio.h>
- #include <math.h>
- int main(void)
- {
- long long int N=0,L=0,R=0;
- long long int i=0,sum=0;
- scanf("%lld %lld %lld",&N,&L,&R);
- long long int L_2 = (long long int)sqrt(L-1)+1;
- long long int R_2 = (long long int)sqrt(R);
- if(R_2>=L_2)
- {
- sum = R-L+1-(R_2-L_2+1);
- }
- else
- {
- sum = R-L+1;
- }
- printf("%lld",sum);
- return 0;
- }

五,Log大侠
atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠。drd需要知道,每次这样操作后,序列的和是多少。
【输入格式】
第一行两个正整数 n m 。6
【数据范围】
对于 30% 的数据, n, m <= 10^3
对于 100% 的数据, n, m <= 10^5
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
解题思路:要注意换底公式
- #include <stdio.h>
- #include <malloc.h>
- #include <math.h>
-
- void solve(int a,int b);
-
- int *Array;
- long long int sum=0;
- int main(void)
- {
- freopen("text.txt","r",stdin);
- int n=0,m=0;
- int i=0,j=0,k=0,a=0,b=0;
- scanf("%d %d",&n,&m);
- Array = (int *)malloc(sizeof(int)*n);
- for(i=0;i<n;i++)
- {
- scanf("%d",Array+i);
- sum+=Array[i];
- }
- for(j=0;j<m;j++)
- {
- scanf("%d %d",&a,&b);
- solve(a,b);
- }
- return 0;
- }
-
- void solve(int a,int b)
- {
- int i=0,j=0,k=0;
- for(i = a-1;i<b;i++)
- {
- j = Array[i];
- k = (int)(log(j)/log(2)+1.0); //换底公式
- Array[i] = k;
- if(j>k) sum-=(j-k);
- else sum-=(k-j);
- }
- printf("%d\n",sum);
- }

六,殖民地
带着殖民扩张的野心,Pear和他的星际舰队登上X星球的某平原。为了评估这块土地的潜在价值,Pear把它划分成了M*N格,每个格子上用一个整数(可正可负)表示它的价值。你需要选择一些格子,然后选择一些围栏把它们围起来,使得所有选择的格子和所有没被选的格子严格的被隔开。选择的格子可以不连通,也可以有“洞”,即一个连通块中间有一些格子没选。注意,若中间有“洞”,那么根据定义,“洞”和连通块也必须被隔开。
Pear的目标很明确,花最小的代价,获得最大的收益。
提交时,注意选择所期望的编译器类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。