标题:积分之迷
小明开了个网上商店,卖风铃。共有3个品牌:A,B,C。
为了促销,每件商品都会返固定的积分。
小明开业第一天收到了三笔订单:
第一笔:3个A + 7个B + 1个C,共返积分:315
第二笔:4个A + 10个B + 1个C,共返积分:420
第三笔:A + B + C,共返积分....
你能算出第三笔订单需要返积分多少吗?
请提交该整数,不要填写任何多余的内容。
105
标题:完美正方形
如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。
历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的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,
你能计算出紧贴着下边沿的是哪几个正方形吗?
请提交紧贴着下边沿的正方形的边长,从左到右,用空格分开。
不要填写任何多余的内容或说明文字。
代码:
#include<bits/stdc++.h>
using namespace std;
int maze[160][160];
int a[19]= {2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50,52};
int book[25];
void init()
{
for(int i =1;i<=47;i++)
for(int j = 1;j<= 47;j++)
maze[i][j] = 47;
for(int i =1;i<=46;i++)
for(int j = 48;j<=47+46;j++)
maze[i][j] = 46;
for(int i = 1;i<=61;i++)
for(int j = 46+47+1;j<=46+47+61;j++)
maze[i][j] = 61;
}//初始化这个矩阵上面的表示已经被填充了
bool check(int x,int y,int k)
{
for(int i=x;i<=x+k-1;i++)
for(int j = y;j<=y+k-1;j++)
if(maze[i][j]!=0)
return false;
return true;
}//判断下这些地方是否都是0 这样子才能用
void output()
{
for(int i =1;i<=154;i++)
{
for(int j = 1;j<=154;j++)
printf("%2d ",maze[i][j]);
putchar('\n');
}
}//输出
void DFS(int x,int y)
{
if(x>154){
output();
return;
}
if(maze[x][y]!=0)
{
if(y==154)DFS(x+1,1);
else DFS(x,y+1);
}else //这个地方没有东西,可以填充东西
{
for(int i = 0;i<19;i++)
{
if(book[i]==1)continue;//这个正方形已经被使用过了
if(x+a[i]-1>154||y+a[i]-1>154||check(x,y,a[i])==false)continue;
for(int k = x;k<x+a[i];k++)
{
for(int l = y;l<y+a[i];l++)
maze[k][l] =a[i];
}
book[i] = 1;
if(y==154)DFS(x+1,1);
else DFS(x,y+1);
book[i] = 0;
for(int k = x;k<x+a[i];k++)
{
for(int l = y;l<y+a[i];l++)
maze[k][l] = 0;
}
}
}
return ;
}
int main()
{
freopen("C:\\Users\\DELL\\Desktop\\b.txt","w",stdout);
init();
DFS(47,48);
return 0;
}
标题:关联账户
为增大反腐力度,某地警方专门支队,对若干银行账户展开调查。
如果两个账户间发生过转账,则认为有关联。如果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;
}
请分析源代码,并提交划线部分缺少的代码。不要填写已有代码或任何多余内容。
if(m[i]==pID)m[i]=qID
标题:密文搜索
福尔摩斯从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>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1024*1024+10;
char str[maxn];
struct node
{
char ch;
int cnt;
}gg[15];
map<char,int>hh;
map<string,int>mp;
bool cmp(node a,node b){
return a.ch<b.ch;//从小到大的字符
}
int main()
{
scanf("%s",str+1);
int len = strlen(str+1);
int n; scanf("%d",&n);
char xixi[10];
if(len<8)
{
printf("0\n");
return 0;
}
int now=0;
for(int i=1;i<=8;i++)
hh[str[i]]++;
map<char ,int >::iterator it=hh.begin();
while(it!=hh.end())
{
gg[++now].ch=it->first;
gg[now].cnt=it->second;
it++;
}
sort(gg+1,gg+1+now,cmp);
string a;
for(int i=1;i<=now;i++)
{
a+=gg[i].ch;
a+=(gg[i].cnt+'0');
} //ok 初始条件已经完成
mp[a]++;
for(int i=2;i<=len;i++)
{
if(i+7<=len)
{
hh[str[i-1]]--;
hh[str[i+7]]++;
int now=0;
map<char,int >::iterator iter=hh.begin();
while(iter!=hh.end())
{
gg[++now].ch=iter->first;
gg[now].cnt=iter->second;
iter++;
}
sort(gg+1,gg+1+now,cmp);
string b;
for(int j=1;j<=now;j++)
{
if(gg[j].cnt==0) continue;
b+=gg[j].ch;
b+=(gg[j].cnt+'0');
}
mp[b]++;
}else break;
}
ll sum=0;
map<char,int>kk;
for(int i=1;i<=n;i++)
{
kk.clear();
int now=0;
scanf("%s",xixi);
for(int j=0;j<8;j++)
kk[xixi[j]]++;
map<char,int >::iterator iter=kk.begin();
while(iter!=kk.end())
{
gg[++now].ch=iter->first;
gg[now].cnt=iter->second;
iter++;
}
sort(gg+1,gg+1+now,cmp);
string b;
for(int j=1;j<=now;j++)
{
if(gg[j].cnt==0) continue;
b+=gg[j].ch;
b+=(gg[j].cnt+'0');
}
sum=sum+mp[b];
}
cout<<sum<<endl;
return 0;
}