牛客每日练习----小明的挖矿之旅,向左走,造一造

我喜欢给自己压力,必须得定一个很高的目标,逼自己朝着这个目标前进,不管会不会实现,都是一个动力。                                      ----喻言

链接:https://ac.nowcoder.com/acm/problem/15119
来源:牛客网

题目描述

    这个挖矿游戏会给出一个n*m个格子的地图,每个格子都有黄金。在游戏开始时小明会随机出现在地图的某一个格子当中。小明可以将他所在的格子的黄金收归囊中,并且还可以向下或者向右移动,然后继续收集黄金。地图上某些格子是障碍物,小明不能移动到有障碍物的格子上。不过,在游戏开始时,小明可以随意地在地图上放置传送门。传送门可以传送到地图上某一个确定的格子,传送门放置的位置和该传送门传送的位置在游戏开始之前必须放置和设置好传送地点。小明有无数个传送门可以使用,但是每次使用传送门所需要的游戏币也是很多的。小明想要至少要使用多少个传送门才能让他在游戏时无论出现在哪个格子,他都能拿到地图上的所有金子。

输入描述:

有多组测试数据。
对于每一组数据:
第一行输入两个整数n和m(0<n,m<=1000),分别表示地图的行数和列数。
接下来输入n行,每行m个字符。每个字符只存在“.”和“#”,“.”表示此格子是黄金,“#”表示此格子是障碍物。

输出描述:

输出一行。此行包括一个整数,表示小明所需传送门数量的最小值。

示例1

输入

复制

3 3
...
.#.
...

输出

复制

1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=998244353;  
const int maxn=2e6+10;
char s[1010];
char p[1010][1010];
int T,n,m;
int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)
            scanf("%s",p[i]+1);
        int jg=0,ct=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(p[i][j]=='.'){
                    jg++;
                    if((p[i+1][j]=='#'||i==n)&&(p[i][j+1]=='#'||j==m))
						ct++;
                }
            }
        }
        printf("%d\n",jg<=1?0:ct);
    }
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/15086
来源:牛客网

题目描述

taotao去参加一个比赛,场地上有很多竖立的杆子,比赛要求参赛者系上一根无限长的绳子,绳子的另一端连接起点(起点为纵坐标最小的杆子,如果有多个杆子纵坐标最小且相同,取横坐标最小的杆子),从起点出发,经过杆子数最多的参赛者获胜(一个杆子只能经过一次),参赛者移动必须满足以下3个条件

1. 只能向左转

2. 只能走直线

3. 不能经过以前走过的路

taotao应该怎样移动才能使获胜的可能最大?

输入描述:

多组输入不超过10组
第一行输入一个整数n,1<=n<=1,000
接下来n行,每行输入3个整数i,Xi,Yi,分别表示杆子的序号以及杆子的横坐标和纵坐标。1<=i,Xi,Yi<=1,000。没有杆子重合

输出描述:

输出一行,按顺序输出taotao走过的杆子序号,每个序号用空格隔开。

示例1

输入

复制

4
1 3 1
2 7 1
3 5 3
4 5 5

输出

复制

1 2 4 3

说明

样例解释如图1,不会出现图2这种情况
(╯‵□′)╯︵┻━┻画图好麻烦
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=998244353;  
const int maxn=2e6+10;
int n;
struct node{
    int x;
    int y;
    int num;
}p[5010];
int mul(node a,node b,node c){
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
int dis(node a,node b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool pd(node a,node b,node c){
    return (mul(a,b,c)>0||(mul(a,b,c)==0&&dis(a,c)<dis(b,c)));
} 
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&p[i].num,&p[i].x,&p[i].y);
        if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x))
            swap(p[0],p[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=i+2;j<n;j++){
            if(pd(p[j],p[i+1],p[i]))
				swap(p[i+1],p[j]);
        }
    }
    for(int i=0;i<n-1;i++)
		printf("%d ",p[i].num);
    printf("%d\n",p[n-1].num);
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/15077
来源:牛客网

题目描述

WYF正试图用一个栈来构造一棵树,现在他已经构造了n个元素作为树的节点,只要将这n个元素依次入栈出栈就可以形成一棵树了。当然,这个问题与树并没有关系,所以它叫做WYF的栈。每次你可以入栈一个新元素或者当栈非空时出栈一个元素,n个元素必须依次入栈,而WYF希望其中第m个元素入栈之后,栈中恰好有k个元素,现在他想知道一共有多少种入栈出栈顺序满足这个条件。

输入描述:

第一行一个正整数T,表示数据组数。(1<=T<=10000)
对于每组数据包含一行三个正整数n,m,k。

输出描述:

 对于每组数据输出一个正整数表示答案。

 由于答案可能过大,所以只需要输出对109+7取模后的答案

 

示例1

输入

复制

2
3 3 3
3 3 2

输出

复制

1
2

示例2

输入

复制

5
10 3 2
10 2 2
10 7 5
10 6 2
10 7 6

输出

复制

6864
11934
2200
3780
924

示例3

输入

复制

2
5 4 4
5 2 1

输出

复制

5
14

备注:

1<=n,m,k<=106
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1e9+7;  
const int maxn=2e6+10;
int f[maxn],v[maxn];
void init(){
	v[0]=v[1]=f[0]=f[1]=1;
    for(int i=2; i<maxn; i++) 
		f[i]=1LL*f[i-1]*i%mod,v[i]=1LL*v[mod%i]*(mod-mod/i)%mod;
    for(int i=2; i<maxn; i++) 
		v[i]=1LL*v[i-1]*v[i]%mod;
}
int C(int n,int m){
    if(m<0||m>n) 
		return 0;
    return 1LL*f[n]*v[m]%mod*v[n-m]%mod;
}
int F(int n,int m){
    return (C(n+m,m)-C(n+m,m-1)+mod)%mod;
}
int main(){
	int n,m,k,T;
    init();
    scanf("%d",&T);
    while (T--){
        scanf("%d%d%d",&n,&m,&k);
        printf("%d\n",1LL*F(m-1,m-k)*F(n-m+k,n-m)%mod);
    }
	return 0;
}

 

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页