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

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");
       }
       else
    	   System.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的藏宝图

不会,待补

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值