2017计算机学科夏令营上机考试

news2024/11/25 1:01:43

 

目录

A:判决素数个数【水题】

B:编码字符串(string)【水题】

C:岛屿周长(matrix)【深搜或者找规律】

D:Safecracker【深搜或者暴力不水】

E:怪盗基德的滑翔翼【动态规划】

F:Full Tank?【图论最短路/BFS+优先队列】

G:实现堆结构

H:Subway(迪杰斯特拉算法)

I:C Looooops

J:Captain Q's Treasure


 

A:判决素数个数【水题】

#include<iostream>
using namespace std;
int sum;
void sushu(int x){
	if(x==1) return;
	for(int j=2;j<=x/2;j++){
		if(x%j==0) return;
	}
	sum++;	
}
int main(){
	int X,Y;
	cin>>X>>Y;
	if(X>Y) swap(X,Y);
	for(int i=X;i<=Y;i++){
		sushu(i);
	}
	cout<<sum;
}

B:编码字符串(string)【水题】

#include<iostream>
using namespace std;

int main(){
	string ch;
	int sum=1;
	cin>>ch;
//  cout<<(int)'A'<<(int)'Z';  65 90
//  cout<<(int)'a'<<(int)'z'; 97 122
	int len=ch.length();
	for(int i=0;i<len;i++){
		if((int)ch[i]>=65&&(int)ch[i]<=90) 
		 ch[i]=ch[i]+32;
	}
	for(int i=0;i<len;i++){
		if(ch[i]==ch[i+1]) sum++;
		else {
			cout<<"("<<ch[i]<<","<<sum<<")";
			sum=1;
		}
	}
	
}

这题挺简单的,就判断就行了,别做复杂了

C:岛屿周长(matrix)【深搜或者找规律】

方法一:深搜

这里的关键在于要把数组全部置为0,因为周长计算的是陆地和海洋相连的地方,也就是说,四周只有有一个海洋(表示为0),周长就可以+1;所以对于第一行、最后一行以及第一列和最后一列,都需要判断输入数组四周的数值,这也是主函数里为什么从1开始存储而不是0的原因。

#include <stdio.h>
#include <string.h>
const int MAXN=110;

int mapp[MAXN][MAXN];  //记录岛屿的信息,1表示陆地,0表示海洋 
int vis[MAXN][MAXN]; //表示已经访问过 
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int n,m,cnt=0;

int dfs(int ni,int nj){
    if(vis[ni][nj]==1){
        return 0;
    }
    if(vis[ni][nj]==0&&mapp[ni][nj]==1){
        vis[ni][nj]=1;
    }
    if(mapp[ni][nj]==0){
        return 1;
    }
    for(int i=0;i<4;i++){
        int ti=ni+dir[i][0];
        int tj=nj+dir[i][1];
        cnt+=dfs(ti,tj);
    }
    return 0;
}

int main()
{
    memset(vis,0,sizeof(vis));
    memset(mapp,0,sizeof(mapp));
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&mapp[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dfs(i,j);
        }
    }
    printf("%d",cnt);
    return 0;
}

方法二:找规律,原理同上,只不过用循环表示了出来,其实没有必要深搜做,除非是为了时间复杂度,因为两层for循环的时间复杂度到n方了

#include<iostream>
using namespace std;
int main(){
	int n, m,ans=0;
	int a[103][103] = {0};//二维矩阵存储
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++) 
			cin >> a[i][j];
	for (int i = 0; i < n; i++)//处理每一个数值为1的点,相邻如果不同,则结果加1
	{
		for (int j = 0; j < m; j++)
		{
			if (a[i][j] == 0) { continue; }
			if (a[i - 1][j] == 0) { ans++; }
			if (a[i + 1][j] == 0) { ans++; }
			if (a[i][j - 1] == 0) { ans++; }
			if (a[i][j + 1] == 0) { ans++; }
		}
	}
	cout << ans;
	return 0;
}

D:Safecracker【深搜或者暴力不水】

POJ1248可以测试,思路就是先把数组按照字典序从大到小排列,然后进行全排列不断尝试是否可行,第一组可行的数据就是字典序最大的数据,直接输出并且结束程序即可

// 可以用strcmp()函数来判断字符串的字典序排序
// 希望得到字典序最大的解 —— 从大到小排序,得到第一个解即返回 
//                         从小到大排序,一直遍历得到最后一个解返回

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

int target;
char str[30];
char ans[10];
int flag = 0; // 判断是否存在解的标志

int change(char a)
{
    int t = a - 'A' + 1;
    return t;
}

bool judge(int a, int b, int c, int d, int e)
{
    if(a-b*b+c*c*c-d*d*d*d+e*e*e*e*e == target)
    {
        return true;
    }
    else 
    {
        return false;
    }
}

void code(int len)
{
    for(int a=0; a<len; a++)
    {
        for(int b=0; b<len; b++)
        {
            if(b == a)
            {
                continue;
            }
            for(int c=0; c<len; c++)
            {
                if(c==b || c==a)
                {
                    continue;
                }
                for(int d=0; d<len; d++)
                {
                    if(d==c || d==b || d==a)
                    {
                        continue;
                    }
                    for(int e=0; e<len; e++)
                    {
                        if(e==d || e==c || e==b || e==a)
                        {
                            continue;
                        }
                        if(judge(change(str[a]), change(str[b]), change(str[c]), change(str[d]), change(str[e])) == true)
                        {
                            flag = 1;
                            ans[0] = str[a];
                            ans[1] = str[b];
                            ans[2] = str[c];
                            ans[3] = str[d];
                            ans[4] = str[e];
                            return ; // 从大到小遍历,得到的第一个解便是字典序最大的解
                        }
                    }
                }
            }
        }
    }   
}

void print()
{
    if(flag == 0) 
    {
        printf("no solution\n");
    }
    else 
    {
        for(int i=0; i<5; i++)
        {
            printf("%c", ans[i]);
        }
        printf("\n");
    }
}

bool cmp(char a, char b)
{
    return a > b;
}

int main()
{   
    // freopen("input.txt","r",stdin);
    while(scanf("%d %s", &target, str)!=EOF)
    {
        flag = 0; // 每次判断前要把上次的标志恢复
        if(target==0 && strcmp(str,"END")==0)
        {
            break;
        }
        int len = strlen(str);
        // 当从小往大查询,查询的数依次增大,最终得到的结果必定是字典序号和最大的
        // 当从大往小查询,得到的第一个解则是字典序号和最大的
        sort(str, str+len, cmp); // 从大到小排序
        code(len);
        print();
    }
    // fclose(stdin);

    return 0;
}

方法二:深搜

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

int target;
char str[30];
char ans[10], temp[10];
int len;
int flag = 0; // 判断是否存在解的标志
int visit[30] = {0}; // 记录字符串每位被访问过与否 

int change(char a)
{
    int t = a - 'A' + 1;
    return t;
}

bool judge(int a, int b, int c, int d, int e)
{
    if(a-b*b+c*c*c-d*d*d*d+e*e*e*e*e == target)
    {
        return true;
    }
    else 
    {
        return false;
    }
}

// DFS搜索到最后得到的是最后一组解,前边的解都会被覆盖
void DFS(int depth)
{
    if(depth >= 5) // 死胡同——搜索5个数,深度从0~4,也就是说深度为5时开始判断本次搜索成功与否
    {   // 加flag==0则从大到小排序,不加flag==0则从小到大排序
        if(judge(change(temp[0]),change(temp[1]),change(temp[2]),change(temp[3]),change(temp[4]))==true && flag==0) // 存在解
        {                      // flag==0 得到第一组解后不再对解更新,第一组解是字典序最大,如果不加这个条件,则最后得到的是最后一组解       
            flag = 1;          
            strcpy(ans, temp); // 将正确的解存入ans,第一次存入的即为字典序最大           
        }
        return ; // 从大到小排序、搜索,得到的第一组解便是字典序最大的解
    }
    // 岔路口——按层次进行探索,探索完成进行回溯
    for(int i=0; i<len; i++)
    {
        if(visit[i] == 0) // 未访问过的字符
        {
            temp[depth] = str[i]; // temp临时记录路径
            visit[i] = 1; // 记录已被访问过
            DFS(depth+1); // 向下一层搜索
            visit[i] = 0; // 回溯,恢复该位置的访问记录
        }
    }
}

void print()
{
    if(flag == 0) 
    {
        printf("no solution\n");
    }
    else 
    {
        for(int i=0; i<5; i++)
        {
            printf("%c", ans[i]);
        }
        printf("\n");
    }
}

bool cmp(char a, char b)
{
    return a > b;
}

int main()
{
    // freopen("input.txt","r",stdin);
    while(scanf("%d %s", &target, str) != EOF)
    {
        flag = 0;
        if(target==0 && strcmp(str,"END")==0)
        {
            break;
        }
        len = strlen(str);
        sort(str, str+len, cmp); // 从大到小排序
        DFS(0); // 搜索
        print();
    }
    // fclose(stdin);

    return 0;
}

E:怪盗基德的滑翔翼【动态规划】

思路分析
本题是一道“最长递增/递减子序列”模板题,利用动态规划来解决。但因为可以向两个方向移动,所以要从左向右、从右向左分别求解最长递减子序列。注:从右向左最长递减子序列 <=> 从左向右最长递增子序列。
因而本题只需要分别求出最长和最短递减子序列,二者中的较大值即为本题结果。

动态规划
设置dp[i]表示以字符S[i]为结尾的最长子串长度,初始化dp[i]=1。
遍历整个字符串,对于每个S[i],遍历S[j] (j<i) ,如果S[i]与S[j]间满足递增或递减条件,且以S[j]为结尾的子序列加上S[i]得到的dp值大于当前以S[i]为结尾子序列的dp值,即dp[j]+1>dp[i],则更新dp[i]=dp[j]+1。输出结果取最大的dp值。

E:怪盗基德的滑翔翼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn = 110;
int tower[maxn];
int dp_d[maxn]; // 以tower[i]为结尾的最长递减子序列长度为dp_d[i];
int dp_i[maxn]; // 以tower[i]为结尾的最长递减子序列长度为dp_i[i];

int LDS(int len) // 最长递减子序列
{
    int ans = -1;
    for(int i=0; i<len; i++) // 以tower[i]为结尾的串
    {
        dp_d[i] = 1; // 先初始化
        for(int j=0; j<i; j++)
        {
            if(tower[j]>=tower[i] && dp_d[j]+1>dp_d[i])
            {
                dp_d[i] = dp_d[j] + 1;
            }
        }
        ans = max(ans, dp_d[i]);
    }

    return ans;
}

int LIS(int len) // 最长递增子序列
{
    int ans = -1;
    for(int i=0; i<len; i++)
    {
        dp_i[i] = 1;
        for(int j=0; j<i; j++)
        {
            if(tower[j]<=tower[i] && dp_i[j]+1>dp_i[i])
            {
                dp_i[i] = dp_i[j] + 1;
            }
        }
        ans = max(ans, dp_i[i]);
    }

    return ans;
}

int main()
{
    // freopen("input.txt", "r", stdin);
    int k;
    scanf("%d", &k);
    int n;
    for(int i=0; i<k; i++)
    {
        scanf("%d", &n);
        for(int j=0; j<n; j++)
        {
            scanf("%d", &tower[j]);
        }
        // 反向最长递减子序列=正向最长递增子序列
        int ans_i = LIS(n); // 反向跳跃等价于 最长递增子序列
        int ans_d = LDS(n); // 正向跳跃等价于 最长递减子序列 
        int ans = max(ans_i, ans_d); // 结果为二者中最大值
        printf("%d\n", ans);
    }
    // fclose(stdin);

    return 0;
}

F:Full Tank?【图论最短路/BFS+优先队列】

参考:Full Tank?(BFS+优先队列)

G:实现堆结构

POJ 4078可以测试

方法一:堆结构的基本操作

//实现堆的基本操作
#include<iostream>
#include<vector>
using namespace std;
int N,ans=0;
vector<int>val;
void DownHeap(){//堆纠正  
	int k=1;
	while(2*k<=ans){//如果有左孩子 k的左孩子为2k 右孩子为2k+1 
		int j=2*k;//指向左孩子
		if(j<ans&&val[j]>val[j+1])//k的左右孩子进行相比较 
			j=j+1;//若右孩子小于左孩子 j指向右孩子 
		if(val[k]<=val[j])//比较小的孩子小 
			break; 
		else//说明父亲节点k要比孩子j大 需要交换 
			swap(val[k],val[j]);//交换位置 
		k=j;//k交换到新的位置,继续向下比较,一直沉到底部 
	}
}
void CreateHeap(int n){//建堆 
	val[++ans]=n;
	int i=ans;
	while(1){
		if(i<=1)
			break;
		if(val[i/2]>val[i])
			swap(val[i/2],val[i]);//进行互换 
		i=i/2;
	}
}
int main(){
	cin>>N;
	val.resize(N+2);
	int type,num;
	for(int i=0;i<N;i++){
		cin>>type;
		if(type==1){
			cin>>num;
			CreateHeap(num); 
		}
		else{
			cout<<val[1]<<endl;//最小值 小顶堆 最小值在第一个
			swap(val[1],val[ans]);
			--ans;//交换之后 长度减一 相当于删除这个最小的元素 在赋值的话会把原来ans位置的元素覆盖掉 不影响后面程序执行 
			DownHeap();//进行堆调整
		}
	}
	return 0;
} 

方法二:优先队列

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

priority_queue<int, vector<int>, greater<int> > q; // 小堆顶结构

int main(){
    int t;
    scanf("%d", &t);
    for(int i=0; i<t; i++){
        int n, type;
        scanf("%d", &n);
        for(int j=0; j<n; j++){
            scanf("%d", &type);
            if(type == 1){
                int u;
                scanf("%d", &u);
                q.push(u);
            }
            if(type == 2){
                printf("%d\n", q.top());
                q.pop();
            }
        }
    }
    return 0;
}

H:Subway(迪杰斯特拉算法)

2017计算机学科夏令营上机考试H:Subway(图的构建+Dijkstra)

I:C Looooops

POJ 2115

#include<cstdio>
#include<cctype>
#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
void exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0){
    x=1;y=0;
    return;
    }
    exgcd(b,a%b,x,y);
    ll temp;
    temp=x;
    x=y;
    y=temp-(a/b)*y;
    return;
}
int main(){
    ll A,B,C,k;
    while(cin>>A>>B>>C>>k){
    if(A==B&&B==C&&C==k&&A==0)return 0;
    ll x,y;
    ll a=C,b=(ll)1<<k,c=B-A;
    if(!c){
        printf("0\n");
        continue;
    }
    ll g=gcd(a,b);
    if(c%g){
        printf("FOREVER\n");
        continue;
    }
    a/=g;b/=g;c/=g;
    exgcd(a,b,x,y);
    x=(x%b*c%b+b)%b;
    printf("%lld\n",x);
    }
    return 0;
}

C Looooops (扩展欧几里得算法)

J:Captain Q's Treasure

自觉放弃好吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解ASEMI代理海矽美快恢复二极管SFP3012A的性能与应用

编辑-Z 在电子元件领域&#xff0c;快恢复二极管SFP3012A是一种重要的半导体器件&#xff0c;它在电路设计中扮演着至关重要的角色。本文将深入探讨SFP3012A的性能特点和应用领域&#xff0c;帮助读者更好地理解和使用这种二极管。 一、SFP3012A的性能特点 快恢复二极管SFP301…

4个在Pandas DataFrame中进行元素比较的函数

大家好&#xff0c;Pandas DataFrame是具有标记行和列的二维数据结构。 有时我们需要对两个DataFrame进行逐个元素的比较。例如&#xff1a; 使用另一个DataFrame的值来更新其中的值。 比较数值&#xff0c;并选择较大或较小的值。 本文将介绍四个不同的Pandas函数&#xf…

阿里前端常考vue面试题汇总

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 Vuex中actions和mutations有什么区别 题目分析 mutations和actions是vuex带来的两个独特…

MySQL原理探索——22 MySQL有哪些“饮鸩止渴”提高性能的方法

不知道你在实际运维过程中有没有碰到这样的情景&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能。 我做项目的时候&#xff0c;就偶尔会碰上这种场景。用户的开发负责人说&#xff0c;不管…

使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

前段时间Cocos2d-x更新了一个Cocos引擎&#xff0c;这是一个集合源码&#xff0c;IDE&#xff0c;Studio这一家老小的整合包&#xff0c;我们可以使用这个Cocos引擎来创建我们的项目。 在Cocos2d-x被整合到Cocos引擎之前&#xff0c;我们可以不那么方便地在我们创建的工程里调…

SpringBoot 实现合并表头导出数据 - EasyExcel应用

文章目录 1. 构建实体类2. 导出3. 导入 EasyExcel是一款开源的Java处理Excel文件的工具库&#xff0c;它提供了简单易用的API&#xff0c;可以方便地读取、写入和操作Excel文件。下面是一些常见的EasyExcel应用场景&#xff1a; 读取Excel文件&#xff1a;使用EasyExcel可以轻…

阿里oss实现拖拽上传+二维码链接展示——技能提升

今天遇到一个需求&#xff0c;就是要实现拖拽上传文件&#xff0c;并调用渲染方法&#xff0c;将渲染后的链接通过二维码展示出来。 上一篇文章也是关于拖拽上传&#xff0c;但是接口是通过后端提供的上传方式来实现的&#xff0c;并非是直接调用阿里OSS来直接实现的。 1.拖拽…

月报总结|Moonbeam 6月份大事一览

本月&#xff0c;Moonbeam赢得第44轮Polkadot平行链插槽拍卖&#xff0c;在未来两年内都将保持活跃&#xff01; 历时一个多月Moonbeam Bear Necessities Hackathon仍在如火如荼地进行着&#xff0c;从深入研究赛题的Workshop到解答疑惑的Office Hours&#xff0c;黑客松让BUI…

代码随想录算法训练营第七天 | 字符串基础系列1(反转字符串--反转字符串II--替换空格--反转字符串中的单词)

字符串基础系列1 344 反转字符串我的代码代码随想录的代码力扣的示例代码 541 反转字符串II我的代码代码随想录的代码力扣的示例代码 剑指offer-05 替换空格我的代码代码随想录的代码力扣的示例代码 151 反转字符串中的单词我的代码代码随想录的代码力扣的示例代码 一段用于复制…

电子时钟制作(瑞萨RA)(6)----配置RTC时钟及显示时间

概述 本文将详细讲解如何借助e2studio来对瑞萨微控制器进行实时时钟&#xff08;RTC&#xff09;的设置和配置&#xff0c;以便实现日历功能和一秒钟产生的中断&#xff0c;从而通过串口输出实时数据。 实时时钟&#xff08;RTC&#xff09;模块是一种时间管理外设&#xff0c…

部署深度学习APP的经历(docker,streamlit cloud,nuitka)

部署深度学习APP的经历 最近&#xff0c;接到一个部署深度学习APP的需求&#xff0c;这个APP使用torch、monai和pydicom等库构建了一个识别CT图像中皮下脂肪、内脏脂肪和骨骼肌&#xff0c;输入是CT图像&#xff0c;输出是识别的图像和相关数据。接手的时候&#xff0c;核心的算…

matlab将数据写入到excel中

第一种&#xff1a; 将数据转化为cell块&#xff0c;从A1单元格写起 % xlswrite(info_10*2.xls ,sheet1,B2:B4) clear; clc; a[1 2 3 4 5 6 ];%三组数据 b[11 22 33 44 55 66]; c[12 23 34 45 56 61]; data [a b c];%把数据保存到data中&#xff0c;其中a的表示转置 [m p]si…

PHP:提交表单之后出现本页面刷新的情况,导致路径参数消失

问题: 提交表单前 提交表单后 刷新之后&#xff0c;参数消失 解决办法 在提交表单的方法中写入代码携带参数的代码 样例&#xff1a; 实施 header(Location: table_detial.php?table_name.$table_name.);

Java Web JavaScript (2)23.7.2

5&#xff0c;BOM BOM&#xff1a;Browser Object Model 浏览器对象模型。也就是 JavaScript 将浏览器的各个组成部分封装为对象。 我们要操作浏览器的各个组成部分就可以通过操作 BOM 中的对象来实现。比如&#xff1a;我现在想将浏览器地址栏的地址改为 https://www.itheim…

m4a音频格式转换器:让音频轻松换装

大家有没有遇到这样的情况——你下载了一个很酷的音频文件&#xff0c;但是播放设备却说“不认识”这个格式&#xff1f;别担心&#xff01;现在有个超级厉害的工具可以帮你解决这个问题&#xff0c;它就是m4a音频格式转换器&#xff01;它能让你的音频文件变身&#xff0c;适应…

Java--基于Swing的登录界面

运行结果: 代码: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class ljt2 {public static void main(String[] args) {// 创建窗体JFrame frame new JFrame("学生信息管理系统");f…

数据处理及评分成果

文章目录 test.py界面展示 pf.pyfpga.py test.py import subprocess import os from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit, QWidget, QLabel import mysql.connector from PySide2.QtGui import QPixmap, QPalette, QColorconn …

spfa求负环

1.虫洞 Wormholes&#xff08;裸spfa判断负环问题&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1507 #include<bits/stdc.h> using namespace std; const int N510,M5210; int d…

【花雕】全国青少年机器人技术一级考试试卷模拟题A组

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

kafka入门,高效读写数据,页缓存+零拷贝技术(十七)

高效读写数据 1)kafka本身是分布式集群&#xff0c;可以采用集群技术&#xff0c;并行度高 2&#xff09;读写数据采用稀疏索引&#xff0c;可以快熟定位要消费的数据 3&#xff09;顺序写磁盘 kafka的producer生产数据&#xff0c;要写入到log文件中&#xff0c;写的过程一直…