2021暑期牛客多校训练1

Determine the Photo Position

题目描述

You have taken the graduation picture of graduates. The picture could be regarded as a matrix A of n × n, each element in A is 0 or 1, representing a blank background or a student, respectively.

However, teachers are too busy to take photos with students and only took a group photo themselves. The photo could be regarded as a matrix B of 1 × m where each element is 2 representing a teacher.

As a master of photoshop, your job is to put photo B into photo A with the following constraints:

  • you are not allowed to split, rotate or scale the picture, but only translation.
  • each element in matrix B should overlap with an element in A completely, and each teacher should overlap with a blank background, not shelter from a student.

Please calculate the possible ways that you can put photo B into photo A.

输入描述:

The first line contains two integers n nn,m mm(1 ≤ n , m ≤ 2000) indicating the size of photos A and B.

In the next n lines,each line contains n characters of ‘0’ or ‘1’,representing the matrix A.

The last line contains m characters of ‘2’, representing matrix B.

输出描述:

Output one integer in a line, indicating the answer.

示例1

输入

5 3
00000
01110
01110
01110
00000
222

输出

6

示例2
输入

3 2
101
010
101
22

输出

0

示例3
输入

3 1
101
010
101
2

输出

4

思路

签到题暴力判断就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
const int N=2e6+5;
const int mod=1e9+7;
#define pep(i,stl) for(auto i:stl)
int arr[2005][2005];
int n,m,cnt;
int main() {
	cin>>n>>m;
	rep(i,1,n)
	rep(j,1,n)
	scanf("%1d",&arr[i][j]);
	string s;
	cin>>s;
	rep(i,1,n)
    {
        int res=0;
        rep(j,1,n)
        if(!arr[i][j]){
            res++;
            if(res>=m) cnt++;
        }
        else res=0;
    }
	cout<<cnt;
	return 0;
}

另一种做法:输入完之后预处理,记录每个空位置向右连续空位置的个数(包括当前空位置),之后遍历数组,得出答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
const int N=2e6+5;
const int mod=1e9+7;
#define pep(i,stl) for(auto i:stl)
int arr[2005][2005],num[2005][2005];
int n,m,cnt;
int main() {
	cin>>n>>m;
	rep(i,1,n)
	rep(j,1,n)
	scanf("%1d",&arr[i][j]);
	string s;
	cin>>s;
	rep(i,1,n)
	pre(j,n,1)
	if(arr[i][j]) num[i][j]=-1;
	else {
		if(j<n&&!arr[i][j+1]) num[i][j]=num[i][j+1]+1;
		else num[i][j]=1;
	}
	rep(i,1,n)
	rep(j,1,n)
	if(num[i][j]>=m)
		cnt++;
	cout<<cnt;
	return 0;
}

Ball Dropping

题目描述

A standard sphere ball is falling in the air, and the center of the sphere is exactly on the centerline of an empty isosceles trapezoidal. The trapezoid is hanging horizontally under the sphere.

img

Please determine whether the ball will get stuck in the trapezoid or drop past the trapezoid.

输入描述:

The input contains four integers r,a,b,h(1≤r,a,b,h≤1000,a>b), indicating the radius of the ball, the top base, the bottom base, and the height of the isosceles trapezoid.

It is guaranteed that 2r≠b,2r<a,2r<h.

输出描述:

Output ‘Drop’ if the sphere ball will drop past the empty trapezoid, otherwise output ‘Stuck’.

If the answer is ‘Stuck’, please also calculate the stuck position(the height between the center of the sphere and the midpoint of the bottom base). Your answer is considered correct if its absolute or relative error does not exceed 10^−6.

示例1

输入

2 8 2 5

输出

Stuck2.2206345966

示例2

输入

1 8 3 5

输出

Drop

思路:

高中的几何题,用相似三角形和勾股定理即可求出

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
const int N=2e6+5;
const int mod=1e9+7;
#define pep(i,stl) for(auto i:stl)
int r,a,b,h;
int main() {
	cin>>r>>a>>b>>h;
	if(2*r<b)
		cout<<"Drop";
	else{
		cout<<"Stuck"<<endl;
		double x=1.0*b*h/(a-b),q=1.0*b/2/r,r=sqrt(x*x+b/2.0*b/2.0);
		printf("%.10f",r/q-x);
	}
	return 0;
}

Alice and Bob

题目描述

Alice and Bob like playing games. There are two piles of stones with numbers n and m. Alice and Bob take turns to operate, each operation can take away k(k>0) stones from one pile and take away s×k(s≥0) stones from another pile. Alice plays first. The person who cannot perform the operation loses the game.

Please determine who will win the game if both Alice and Bob play the game optimally.

输入描述:

The first line contains an integer T(1≤T≤10^4) denotes the total number of test cases.
Each test case contains two integers n,m(1≤n,m≤5×10^3) in a line, indicating the number of two piles of stones.

输出描述:

For each test case, print “Alice” if Alice will win the game, otherwise print “Bob”.

示例1

输入

52 33 55 77 57 7

输出

BobAliceBobBobAlice

思路:
把{0,0}作为最初的必败状态,那么,所有可以一步推导为{0,0}的就是先手必胜。能一步推导为{0,0}的状态{x,y}为:{x+k,y+l*k}(x+k<=5000,y+l*k<=5000),{x+l*k,y+k}(y+k<=5000,x+l*k<=5000)

将先手必胜点记为1,先手必败点记为0。以此递推出所有的必胜必败点,并记录在数组中。之后每输入一个数据直接判断即可。

注意数组要用bool类型,不然会超时。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
const int N=2e6+5;
const int mod=1e9+7;
#define pep(i,stl) for(auto i:stl)
int arr[2005][2005];
bool dp[5005][5005];
ll n,m,cnt;
int main() {
	rep(i,0,5000)
	rep(j,0,5000){
		if(!dp[i][j]){
		for(int k=1;i+k<=5000;k++)
		for(int l=0;j+l*k<=5000;l++)
		dp[i+k][j+l*k]=1;
		for(int k=1;j+k<=5000;k++)
		for(int l=0;i+l*k<=5000;l++)
		dp[i+l*k][j+k]=1;	
		}
	}
	int t;
    cin>>t;
	while(t--){
        cin>>n>>m;
		if(dp[n][m]) puts("Alice");
		else puts("Bob");
	}	
	return 0;
}

Find 3-friendly Integers

题目描述

A positive integer is 3-friendly if and only if we can find a continuous substring in its decimal representation, and the decimal integer represented by the substring is a multiple of 3.

For instance:

  1. 104 is 3-friendly because “0” is a substring of “104” and 0 mod  3=0.
  2. 124 is 3-friendly because “12” is a substring of “124” and 12 mod  3=0. “24” is also a valid substring.
  3. 17 is not 3-friendly because 1mod  3≠0, 7mod  3≠0, 17mod  3≠0.

Note that the substring with leading zeros is also considered legal.

Given two integers L and R, you are asked to tell the number of positive integers x such that L≤x≤R and x is 3-friendly.

输入描述:

There are multiple test cases. The first line of the input contains an integer T(1≤T≤10000), indicating the number of test cases. For each test case:

The only line contains two integers L,R(1≤L≤R≤10^18), indicating the query.

输出描述:

For each test case output one line containing an integer, indicating the number of valid x.

示例1

输入

34 101 201 100

输出

31176

思路:

当数据大到1e^18时,这时通常的做法就是打表找规律了。

通过打表发现,大于等于100的数全是3-friendly的数。因此,记录100以内不是3-friendly的数在这里插入图片描述判断这些数是否在区间内,若在则将区间长度减去不是3-friendly的数的个数,若都不在则输出区间长度

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-6
const int N=2e6+5;
const int mod=1e9+7;
#define pep(i,stl) for(auto i:stl)
int a[24]= {1,2,4,5,7,8,11,14,17,22,25,28,41,44,47,52,55,58,71,74,77,82,85,88};
int main() {
	ll t,l,r,cnt=0;
	cin>>t;
	while(t--) {
		cin>>l>>r;
		cnt=r-l+1;
		rep(i,0,23)
		if(a[i]>=l&&a[i]<=r) cnt--;
		cout<<cnt<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值