自己计时4小时做了试试,发现只用了2个小时多一点,第二题和第六题实在没办法,不会做,第五题用了暴力(过不了多少数据),其他三题在网上看了看 应该都是对的,下面放上试题及答案。
1、
标题:积分之迷
小明开了个网上商店,卖风铃。共有3个品牌:A,B,C。
为了促销,每件商品都会返固定的积分。
小明开业第一天收到了三笔订单:
第一笔:3个A + 7个B + 1个C,共返积分:315
第二笔:4个A + 10个B + 1个C,共返积分:420
第三笔:A + B + C,共返积分....
你能算出第三笔订单需要返积分多少吗?
请提交该整数,不要填写任何多余的内容。
这题我用暴力写的,答案是105,下面贴上个人代码:
#include<stdio.h> int main() { int i,j,k; for(i=1;i<100;i++) { for(j=1;j<100;j++) { for(k=1;k<100;k++) { if(3*i+7*j+k==315&&4*i+10*j+k==420) { printf("%d %d %d %d ",i,j,k,i+j+k); } } } } return 0; }
2、
标题:完美正方形
如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。
历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的22个正方形
2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 50 60
如【图1.png】那样组合,就是一种解法。此时,
紧贴上边沿的是:60 50
紧贴下边沿的是:26 28 17 21 18
22阶完美正方形一共有8种。下面的组合是另一种:
2 5 9 11 16 17 19 21 22 24 26 30 31 33 35 36 41 46 47 50 52 61
如果告诉你该方案紧贴着上边沿的是从左到右依次为:47 46 61,
你能计算出紧贴着下边沿的是哪几个正方形吗?
请提交紧贴着下边沿的正方形的边长,从左到右,用空格分开。
不要填写任何多余的内容或说明文字。
这题我不会,看了下网上的答案是线段树+搜索,贴一下别人的链接吧:https://blog.csdn.net/lonverce/article/details/51436195
3、
标题:关联账户
为增大反腐力度,某地警方专门支队,对若干银行账户展开调查。
如果两个账户间发生过转账,则认为有关联。如果a,b间有关联, b,c间有关联,则认为a,c间也有关联。
对于调查范围内的n个账户(编号0到n-1),警方已知道m条因转账引起的直接关联。
现在希望知道任意给定的两个账户,求出它们间是否有关联。有关联的输出1,没有关联输出0
小明给出了如下的解决方案:
#include <stdio.h>
#define N 100
int connected(int* m, int p, int q)
{
return m[p]==m[q]? 1 : 0;
}
void link(int* m, int p, int q)
{
int i;
if(connected(m,p,q)) return;
int pID = m[p];
int qID = m[q];
for(i=0; i<N; i++) _____________________________________; //填空位置
}
int main()
{
int m[N];
int i;
for(i=0; i<N; i++) m[i] = i; //初始状态,每个节点自成一个连通域
link(m,0,1); //添加两个账户间的转账关联
link(m,1,2);
link(m,3,4);
link(m,5,6);
link(m,6,7);
link(m,8,9);
link(m,3,7);
printf("%d ", connected(m,4,7));
printf("%d ", connected(m,4,5));
printf("%d ", connected(m,7,9));
printf("%d ", connected(m,9,2));
return 0;
}
请分析源代码,并提交划线部分缺少的代码。不要填写已有代码或任何多余内容。
分析一下代码就知道,题意是将所有有联系的账户的m数组值变为相同的值,参考答案 if(m[i]==pID) m[i]=qID
4、
标题:密文搜索
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
数据格式:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
要求输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
例如:
用户输入:
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
则程序应该输出:
4
这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
资源约定:
峰值内存消耗 < 512M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
这题我是这么想的,统计字符串字母出现的次数,然后与密码中字母出现的次数做比较,如果相等总数加1。个人代码如下:
1 #include<stdio.h> 2 int times[26]; 3 char s[1200000]; 4 char c[9]; 5 int answer[1001][26]; 6 int n; 7 void init() 8 { 9 int i; 10 for(i=0;i<26;i++) 11 times[i]=0; 12 } 13 int check(int i) 14 { 15 int j; 16 for(j=0;j<26;j++) 17 if(answer[i][j]!=times[j]) 18 return 0; 19 return 1; 20 } 21 int main() 22 { 23 int i,j,sum=0; 24 for(i=0;i<1001;i++) 25 for(j=0;j<26;j++) 26 answer[i][j]=0; 27 scanf("%s",s); 28 scanf("%d",&n); 29 for(i=0;i<n;i++) 30 { 31 scanf("%s",c); 32 for(j=0;j<8;j++) 33 answer[i][c[j]-'a']++; 34 } 35 for(i=0;s[i+7]!='