浙江中医药大学第十二届大学生程序设计竞赛 部分题解

本文主要是介绍浙江中医药大学第十二届大学生程序设计竞赛 部分题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem A. Jhadgre的C语言程序

helle 直接复制

Problem B. Wpremig的AH之战

博弈问题还没有学,待补

Problem C. Wpremig的三角形

没看这题,这题人出的也少,待补

Problem D. Jhadgre的梯子

链接:https://ac.nowcoder.com/acm/contest/333/D
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

陶陶摘了这么多年苹果,Jhadgre他也很想摘苹果。

这天Jhadgre趁着陶陶还没起床,决定先去把苹果摘了,现在Jhadgre知道树上有N个苹果以及每个苹果离地面的高度,当然机智的Jhadgre不会像陶陶一样只带一个30厘米的板凳,聪明的Jhadgre决定带一架梯子!这样就可以摘到所有苹果了。

现在Jhadgre告诉你他把手伸直的时候能够到达的最大高度,请你帮他算一下他需要带一架至少多高的梯子才能摘到所有苹果。假设他碰到苹果苹果就会掉下来。

输入描述:

第一行两个个整数N,L(1<=N,L<=100000)表示有N个苹果和Jhadgre把手伸直的时候能够到达的最大高度L。
接下去N个正整数a1,a2,...an,表示每个苹果离地面的高度。(1<=ai<=2147484649)

输出描述:

输出Jhadgre需要带的梯子的高度。若不需要梯子Jhadgre就能摘到所有苹果则输出0.

示例1

输入

复制

5 50
10 20 30 40 100

输出

复制

50

水题,注意long long  就行

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define pd(n) scanf("%d\n",n)
#define pll(n) scanf("%lld\n",n)
#define MAX 26
typedef long long ll;
const ll mod=1e6;
ll a[N];
bool vis[N];
char c[]={'6','7','8','9','T','J','Q','K','A'};
int main(){ll n,l;cin>>n>>l;ll ans = l;for (int i = 0 ; i < n ; ++i){ll x;cin>>x;if (x >ans)ans = x;}cout<<ans-l<<endl;return 0;
}

 

Problem E. Jhadgre的合唱队形

不会,好像是树状数组+一些东西,待补

Problem F. Jhadgre的伤心地

链接:https://ac.nowcoder.com/acm/contest/333/F
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Jhadgre为了他的女神,准备了一场盛大的告白,可惜却被女神毫不留情的拒绝。于是Jhadgre决定离开这个伤心之地。但是钱都被Jhadgre拿去准备告白了,剩下的钱并不够他买车票,只够他坐公交车。

Jhadgre所在城市的所有公交车站总体来说都在一条直线上,在这里有两种公交车,一种是全城公交,这种公交车在城市的任何一站都可以上下车,付了车费后,从当前站开始,最多可以向后坐5站(即从第i站上车,可以选择在第i+1,i+2,i+3,i+4,i+5站下车)。还有一种是区间公交,也就是可以在第X站上车,直到第Y站(X<Y),中途每一站都可以下车但不可以上车。所有公交车的上车费都是2元。

现在Jhadgre为了最快的逃离这个伤心地,他决定不管上哪种公交车,只要上去了,就一定坐到底再下车,中途不会下车,并且他现在所在的地点为第1站,他认为要到第N站以后的站,他才算彻底逃离这个伤心地。

现在Jhadgre想知道他手里的钱够不够逃离这个伤心地,你可以帮他计算一下他最少需要花多少钱才能离开这个伤心地吗?

输入描述:

只包含一组数据。
第一行一个整数N,意义如题(10<=N<=100)
接下去一行中共N个整数a1,a2,a3...aN,由空格隔开,ai表示第i站的区间公交能到达第ai站,保证(i<ai)

输出描述:

Jhadgre最少需要花的钱

示例1

输入

复制

10
7 11 4 5 6 7 8 9 10 11

输出

复制

4

说明

以下给出两种乘车方案:(1) Jhadgre在第1站选择上全城公交,到达第6站,付2元钱,接着在第6站选择上全城公交,到达第11站,共付4元钱。(2) Jhadgre在第1站选择上区间公交,到达第7站,付2元钱,接着在第7站选择上全城公交,到达第12站,共付4元钱。

 

分析:这题一开始以为是DP,但后面的状态不好由前面所推出,所以直接递归就可以,从前面往后推(f【i】——》f【a【i】】或f【i+5】),推出哪一个先到就ok了

         

 
#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define pd(n) scanf("%d\n",n)
#define pll(n) scanf("%lld\n",n)
#define MAX 26
typedef long long ll;
const ll mod=1e6;
ll a[N];
bool vis[N];
ll n;
char c[]={'6','7','8','9','T','J','Q','K','A'};
int f(int x)
{if(x>n) return 0;return min(f(a[x]),f(x+5))+2;}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}cout<<f(1)<<endl;return 0;
}

Problem G. Wpremig的称球问题

 

这题在我看完所有题的都不会的情况下,尝试写了写,多谢百度的公式,

需要写一个大数,但我又犯了不认真看题的毛病了,输出Yes我输出YES了 哎

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.StringTokenizer;public class Main {static Scanner in = new Scanner(System.in);public static void main(String args[])throws IOException  {while(in.hasNext()){int n=in.nextInt();int m=in.nextInt();if(n<=2){System.out.println("NO");continue;}BigDecimal x=new BigDecimal(n);BigDecimal a=new BigDecimal(3);BigDecimal b=new BigDecimal(2);BigDecimal bd = new BigDecimal(3);bd = bd.pow(m); bd=bd.subtract(a);bd=bd.divide(b);if(bd.compareTo(x)>=0){System.out.println("YES");}elseSystem.out.println("NO");}}}

一种不需要大数的写法:我们最后比较次数,我们发现3^15=14 348 907,超过了数据范围了,所以我们只要枚举次数即可

#include<bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2;
int main()
{while(scanf("%d%d",&n,&m)!=-1){if(n==2) {cout<<"No"<<endl;continue;}   long long k=3;int j=1;for(j=2;j<=15;j++){k=k*3;if((k-3)/2>=n) break;}if(j<=m) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;}

Problem H. Jhadgre的回家之路

链接:https://ac.nowcoder.com/acm/contest/333/H
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Jhadgre作为一个热(xiang)爱(dang)学(xian)习(yu)的好同学,每天都在掰着手指头等周末。

今天终于到了周五,等到下午六点他就又可以在寝室做两天咸鱼了。但是Jhadgre上午上完课把钥匙丢在了教室,被Wpremig捡到了,所以他必须先去Wpremig手里取得钥匙才能回寝室。

于是机智的Wpremig为了方便Jhadgre拿钥匙,他去配了好多把Jhadgre的钥匙,分别放在不同的地方 (厉害了小老弟)。

现在Jhadgre想要尽快的回到寝室中,他需要取得任意一把钥匙才能够回寝室,请你帮他计算出回寝室的最短路程。

学校可以背看做是一个n * n的网格,其中一些路有障碍,钥匙和家所在的地方也可以看做是道路,可以通过。Jhadgre可以在任意一条道路中选择上下左右四个方向移动,一次移动算作一步。

输入描述:

多组数据,T<=50,对于每组数据有:
第一行有两个整数n,m。
接下去n行每行m个字符,代表学校地图。
其中, '.'表示道路,'#'表示障碍物,'L'表示Jhadgre所在的位置,'W'表示钥匙的位置,'Q'表示寝室的位置。题目保证最少有一条路可以拿到钥匙并且回到寝室。

输出描述:

Jhadgre回寝室需要走的最少步数。

示例1

输入

复制

8 10
W....#.#W#
..#..#...#
...Q##.#.#
##........
..##.#..##
..........
##..#...##
###..L....

输出

复制

17

分析:

L->W->Q,一开始想遍历bfs全部Q->L和Q->W,但是超时,然后优化了一下,一L和Q为起点两次bfs全部的图,得到每一次到达w的距离,枚举全部比较即可

#include<bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2;
char mapp[2005][2005];
int vis[2005][2005]={0};
int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1};
int dis1[2005][2005];
int dis2[2005][2005];
struct node
{int x,y,step;
}a,b;
int bfs1(int x1,int y1)
{memset(vis,0,sizeof(vis));queue<node>q;a.x=x1;a.y=y1;vis[a.x][a.y]=1;a.step=0;q.push(a);int i=0;while(!q.empty()){a=q.front();q.pop();for(int i=0;i<4;i++){b.x=a.x+dx[i];b.y=a.y+dy[i];if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&mapp[b.x][b.y]!='#'&&!vis[b.x][b.y]){vis[b.x][b.y]=1;dis1[b.x][b.y]=a.step+1;b.step=a.step+1;q.push(b);}}}return 0;}
int bfs2(int x1,int y1)
{memset(vis,0,sizeof(vis));queue<node>q;a.x=x1;a.y=y1;vis[a.x][a.y]=1;a.step=0;q.push(a);while(!q.empty()){a=q.front();q.pop();for(int i=0;i<4;i++){b.x=a.x+dx[i];b.y=a.y+dy[i];if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&mapp[b.x][b.y]!='#'&&!vis[b.x][b.y]){vis[b.x][b.y]=1;b.step=a.step+1;dis2[b.x][b.y]=b.step;q.push(b);}}}return 0;}vector<node>v;
int main()
{int i,j;while(scanf("%d%d",&n,&m)!=EOF){int x,y;int sx1,sy1,sx2,sy2;for(i=0;i<n;i++){scanf("%s",&mapp[i]);for(int j=0;j<m;j++){if(mapp[i][j]=='L'){sx1=i;sy1=j;}else if(mapp[i][j]=='Q'){sx2=i;sy2=j;}else if(mapp[i][j]=='W'){node t;t.x=i;t.y=j;v.push_back(t);}}}int minn3=1e9;;memset(dis1,0,sizeof(dis1));memset(dis2,0,sizeof(dis2));bfs1(sx1,sy1);bfs2(sx2,sy2);for(int i=0;i<v.size();i++){minn3=min(dis1[v[i].x][v[i].y]+dis2[v[i].x][v[i].y],minn3);}v.clear();cout<<minn3<<endl;}return 0;}

Problem I. Jhadgre的小饼干

链接:https://ac.nowcoder.com/acm/contest/333/I
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

最近Jhadgre拿到了一个系列表情包,他很高兴,于是他给每个关系好的女性好友都送了一盒饼干外带这一套表情包。

 

结果让他惊呆了,竟然真的有女孩子答应他........再来一盒(不然你以为?)

当然也有人回复一些其他的消息...唯独没有答应做他女朋友的人。

Jhadgre很伤心,但是作为一个有原则的人,既然答应了送别人小饼干,那就必须要给!

所有人的回复都由大写字母,小写字母与','组成,占一行,Jhadgre认为只要其中包含了连续的10个小写字母"zailaiyihe"就意味着这个人想要再来一盒。

现在Jhadgre准备给每一个想要“再来一盒”的人买一盒小饼干,他想知道总共需要买几盒小饼干?

输入描述:

第一行一个整数N,表示有N个人回复(1<=N<=1000)
接下去N行每行都是一个人的回复,由大写字母,小写字母与','组成。
(数据保证每行字符不超过1000个)

输出描述:

一个整数表示Jhadgre需要买几盒小饼干

示例1

输入

复制

3
Bu,xing
wokeyizailaiyihe
no

输出

复制

1

水题

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define pd(n) scanf("%d\n",n)
#define pll(n) scanf("%lld\n",n)
#define MAX 26
typedef long long ll;
const ll mod=1e6;
ll a[N];
bool vis[N];
char c[]={'6','7','8','9','T','J','Q','K','A'};
int main(){ll n;cin>>n;int m=0;while(n--){string s;cin>>s;if(s.find("zailaiyihe")!=-1){m++;}}cout<<m<<endl;return 0;
}

Problem J. Jhadgre爬楼梯

链接:https://ac.nowcoder.com/acm/contest/333/J
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

继上次Jhadgre在楼梯上跳台阶玩了很久之后,他获得了一个很强(la)力(ji)的能力,那就是上楼梯的时候可以跨任意偶数级台阶....

今天上完课,Jhadgre又开始了他的跳台阶之旅,现在他想知道跳到第N级台阶有多少种方案数。

P.S.Jhadgre从楼梯外也就是第0级开始跳,并且依旧可以选择跳一级

输入描述:

多组数据(<=100组),每组数据包含一个整数N(2<=N<=10000)

输出描述:

对于每组数据包含一个整数表示跳到第N级台阶的方案数(答案对100000007取模)

示例1

输入

复制

3
4 

输出

复制

3
6

分析:递归题,不过我一开始看错题了,以为它可以跳到任意偶数位置,然后就自闭了,后来发现他是跨越偶数阶台阶,

递归就行,每一个位置可以由他的前一个,和前面相差偶数个位置得来。

 
#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define pd(n) scanf("%d\n",n)
#define pll(n) scanf("%lld\n",n)
#define MAX 26
typedef long long ll;
const ll mod=100000007;
ll a[N];
bool vis[N];
int dp[N];
int main(){int n;dp[0]=1;for(int i=1;i<=10005;i++) {dp[i]=(dp[i]+dp[i-1])%mod;for(int j=i-2;j>=0;j-=2)dp[i]=(dp[i]+dp[j])%mod;}while(scanf("%d",&n)!=-1){cout<<dp[n]<<endl;}return 0;
}

Problem K. Jhadgre的&pi;

BBP公式,待补

Problem L. Wpremig's Niuniu

没读懂,待补

Problem M. Wpremig和Jhadgre的藏宝图

不会,待补

 

这篇关于浙江中医药大学第十二届大学生程序设计竞赛 部分题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379518

相关文章

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析