蓝桥杯第六届决赛B组

1

标题:积分之迷
小明开了个网上商店,卖风铃。共有3个品牌:A,B,C。
为了促销,每件商品都会返固定的积分。
小明开业第一天收到了三笔订单:
第一笔:3个A + 7个B + 1个C,共返积分:315
第二笔:4个A + 10个B + 1个C,共返积分:420
第三笔:A + B + C,共返积分…
你能算出第三笔订单需要返积分多少吗?
请提交该整数,不要填写任何多余的内容。

3A+7B+C=315 (1)
4A+10B+C=420 (2)
(1)-(2)=A+3B=105 (3)
(1)-2(3)=A+B+C=105;

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,
你能计算出紧贴着下边沿的是哪几个正方形吗?
请提交紧贴着下边沿的正方形的边长,从左到右,用空格分开。
不要填写任何多余的内容或说明文字。

在这里插入图片描述

#include<cstdio>
#include<cstring>
#include<cctype>
#include<string>
#include<set>
#include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define mod 10000007
#define debug() puts("what the fuck!!!")
#define N 1111111
#define M 1000000
#define ll longlong
using namespace std;
int a[19]= {2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50, 52};
int map[154][154];
int vis[100];
void fill(int x,int y,int n,int num)
{
    for(int i=x; i<x+n; i++)
        for(int j=y; j<y+n; j++)
            map[i][j]=num;
}
int solve()
{
    for(int i=0; i<154; i++)
        for(int j=0; j<154; j++)
            if(!map[i][j])
                return 0;
    return 1;
}
int judge(int x,int y,int n)
{
    if(x+n>154||y+n>154)
        return 0;
    for(int i=x; i<n+x; i++)
        for(int j=y; j<n+y; j++)
            if(map[i][j])
                return 0;
    return 1;
}
int dfs(int x,int y)
{
    if(solve())
        return 1;
    else
    {
        int flag=1;
        for(int i=0; i<154&&flag; i++)
            for(int j=0; j<154&&flag; j++)
                if(!map[i][j])
                    x=i,y=j,flag=0;
        for(int k=0; k<19; k++)
        {
            if(judge(x,y,a[k]))
            {
                if(!vis[k])
                {
                    fill(x,y,a[k],a[k]);
                    vis[k]=1;
                    if(dfs(x,y+a[k]))
                        return 1;
                    fill(x,y,a[k],0);
                    vis[k]=0;
                }
            }
            else
                break;
        }
    }
    return 0;
}
int main()
{
    mem(map,0);
    mem(vis,0);
    fill(0,0,47,47);
    fill(0,47,46,46);
    fill(0,93,61,61);
    dfs(0,0);
    int ans=0;
    for(int i=0; i<154; i++)
    {
        if(map[153][i]!=ans)
        {
            printf("%d ",map[153][i]);
            ans=map[153][i];
        }
    }
    return 0;
}

https://blog.csdn.net/riba2534/article/details/72577289

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;
}

if(m[i]==qID)m[i]=pID;
m[i]=(m[i]==qID?pID:m[i])(并查集思想)

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 , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int ans=0;string str;
void fun(string s){
    sort(s.begin(),s.end());
    for(int i=0;i<=str.length()-8;i++){
        string ss=str.substr(i,8);
        sort(ss.begin(),ss.end());
        if(ss==s){
            ans++;
        }
    }
}
int main(){

    cin>>str;
    getchar();
    int n;
    cin>>n;
    getchar();
    while(n--){
        string s;
        cin>>s;
        getchar();
        fun(s);
        
    }
    printf("%d\n",ans);
    return 0;
}

5标题:居民集会

标题:居民集会
蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di。
每年,蓝桥村都要举行一次集会。今年,由于村里的人口太多,村委会决定要在4个地方举行集会,其中3个位于公路中间,1个位最公路的终点。
已知每户家庭都会向着远离公路起点的方向去参加集会,参加集会的路程开销为家庭内的人数ti与距离的乘积。
给定每户家庭的位置di和人数ti,请为村委会寻找最好的集会举办地:p1, p2, p3, p4 (p1<=p2<=p3<=p4=L),使得村内所有人的路程开销和最小。
【输入格式】
输入的第一行包含两个整数n, L,分别表示蓝桥村的家庭数和公路长度。
接下来n行,每行两个整数di, ti,分别表示第i户家庭距离公路起点的距离和家庭中的人数。
【输出格式】
输出一行,包含一个整数,表示村内所有人路程的开销和。
【样例输入】
6 10
1 3
2 2
4 5
5 20
6 5
8 7
【样例输出】
18
【样例说明】
在距起点2, 5, 8, 10这4个地方集会,6个家庭需要的走的距离分别为1, 0, 1, 0, 2, 0,总的路程开销为13+02+15+020+25+07=18。
【数据规模与约定】
对于10%的评测数据,1<=n<=300。
对于30%的评测数据,1<=n<=2000,1<=L<=10000,0<=di<=L,di<=di+1,0<=ti<=20。
对于100%的评测数据,1<=n<=100000,1<=L<=1000000,0<=di<=L,di<=di+1,0<=ti<=1000000。
资源约定:
峰值内存消耗 < 512M
CPU消耗 < 5000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

其实我没懂,摘自https://blog.csdn.net/qq_34446253/article/details/51474755

#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000+5; 
int d[maxn],t[maxn],n,L;
int w[maxn][maxn];
 
int solve(int x,int y,int cur)  //[x,y] 还能分cur次 
{
	if(!cur) return w[x][y];
	
	int ML,MR,M;
	M=2*w[0][L];
	for(int m=x+1;m<y;m++)
	{
		ML=solve(x,m,cur-1);  //分为两个区间 
		MR=solve(m,y,cur-1);
		M=min(M,ML+MR);
	}
	return M;
}
int main()
{
	scanf("%d%d",&n,&L);
	for(int i=0;i<n;i++)
		scanf("%d%d",&d[i],&t[i]);
	for(int i=0;i<=L;i++)  //[i,j] w[i][j]为区间i~j所需的开销 
	for(int j=i;j<=L;j++)
	{
		for(int k=0;k<n;k++)
		{
			if(d[k]>i&&d[k]<j)
			{
				w[i][j]+=(j-d[k])*t[k];
			}
		}
	}
	cout<<solve(0,L,2);
	return 0;
}

6

标题:模型染色
在电影《超能陆战队》中,小宏可以使用他的微型机器人组合成各种各样的形状。
现在他用他的微型机器人拼成了一个大玩具给小朋友们玩。为了更加美观,他决定给玩具染色。
小宏的玩具由n个球型的端点和m段连接这些端点之间的边组成。下图给出了一个由5个球型端点和4条边组成的玩具,看上去很像一个分子的球棍模型。
由于小宏的微型机器人很灵活,这些球型端点可以在空间中任意移动,同时连接相邻两个球型端点的边可以任意的伸缩,这样一个玩具可以变换出不同的形状。在变换的过程中,边不会增加,也不会减少。
小宏想给他的玩具染上不超过k种颜色,这样玩具看上去会不一样。如果通过变换可以使得玩具变成完全相同的颜色模式,则认为是本质相同的染色。现在小宏想知道,可能有多少种本质不同的染色。
【输入格式】
输入的第一行包含三个整数n, m, k,
分别表示小宏的玩具上的端点数、边数和小宏可能使用的颜色数。端点从1到n编号。
接下来m行每行两个整数a, b,表示第a个端点和第b个端点之间有一条边。输入保证不会出现两条相同的边。
【输出格式】
输出一行,表示本质不同的染色的方案数。由于方案数可能很多,请输入方案数除10007的余数。
【样例输入】
3 2 2
1 2
3 2
【样例输出】
6
【样例说明】
令(a, b, c)表示第一个端点染成a,第二个端点染成b,第三个端点染成c,则下面6种本质不同的染色:(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 2), (2, 2, 2)。
而(2, 1, 1)与(1, 1, 2)是本质相同的,(2, 2, 1)与(2, 1, 2)是本质相同的。
【数据规模与约定】
对于20%的评测数据,1<=n<=5, 1<=k<=2。
对于50%的评测数据,1<=n<=10, 1<=k<=8。
对于100%的评测数据,1<=n<=10, 1<=m<=45, 1<=k<=30。
资源约定:
峰值内存消耗 < 512M
CPU消耗 < 5000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

在这里插入图片描述

2015年决赛 C/C++大学B组 考生须知:

 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试题。
 考试时间为4小时。时间截止后,提交答案无效。
 在考试强制结束前,选手可以主动结束考试(需要身份验证),结束考试后将无法继续提交或浏览答案。
 选手可浏览自己已经提交的答案。被浏览的答案允许拷贝。
 对同一题目,选手可多次提交答案,以最后一次提交的答案为准。
 选手切勿在提交的代码中书写“姓名”、“考号”,“院校名”等与身份有关的信息或其它与竞赛题目无关的内容,否则成绩无效。
 选手必须通过浏览器方式提交自己的答案。选手在其它位置的作答或其它方式提交的答案无效。
 试题包含三种类型:“结果填空”、“代码填空”与“程序设计”。
结果填空题:
要求选手根据题目描述直接填写结果。求解方式不限。不要求源代码。
答案直接通过网页提交即可。不要书写多余的内容。
代码填空题:
要求选手在弄清给定代码工作原理的基础上,填写缺失的代码,使得程序逻辑正确。
所填写的代码不超过一条语句(即中间不能出现分号)。
把答案(仅填空处的答案,不包括题面已存在的代码或符号)直接通过网页提交。
不要书写多余的内容(比如注释)。
使用ANSI C/ANSI C++ 标准,不要依赖操作系统或编译器提供的特殊函数。
程序设计题目:
要求选手设计的程序对于给定的输入能给出正确的输出结果。
考生的程序只有能运行出正确结果才有机会得分。
注意:在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
要求选手给出的解答完全符合ANSI C++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库,但不能使用MFC或ATL等非ANSI C++标准的类库。例如,不能使用CString类型(属于MFC类库)。
注意: main函数必须返回0
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
所有源码必须在同一文件中。调试通过后,拷贝提交。
提交时,注意选择所期望的编译器类型。

  1. 结果填空 (满分15分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    不限解决问题的方式或工具,只要求结果。
    只能通过浏览器提交答案。

  2. 结果填空 (满分39分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    要求参见前一题。

  3. 代码填空 (满分21分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    填写的代码必须符合ANSI C/C++ 标准。
    代码不能只对题面特殊数据有效,应当具有通用性。
    不要填写多余内容(如:题面上已存在的代码或符号)。
    只能通过浏览器提交答案。

  4. 程序设计(满分47分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
    仔细阅读程序的输入、输出要求,千万不要输出没有要求的、多余的内容,例如:“请您输入xx数据:”。
    建议仔细阅读示例,不要想当然!
    处理完一个用例的数据后,立即退出(return 0),不要循环等待下一个用例的输入。
    程序必须使用标准输入、标准输出,以便于机器评卷时重定向。
    要求选手给出的解答完全符合ANSI C/C++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
    代码中允许使用STL类库,但不能使用MFC或ATL等非ANSI C++标准的类库。例如,不能使用CString类型(属于MFC类库)。
    注意: main函数结尾需要return 0
    注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    提交时,注意选择所期望的编译器类型。

  5. 程序设计(满分79分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    要求参见前一题。

  6. 程序设计(满分99分)
    问题的描述在考生文件夹下对应题号的“题目.txt”中。相关的参考文件在同一目录中。
    要求参见前一题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值