【纪中】2020.03.14

纪中2020.03.14比赛题


题目链接:2020.03.14【NOIP普及组】模拟赛C组16

T1

题目描述

FJ的奶牛喜欢探索农场周围的地形。一开始,所有N(1<=N<=1,000,000,000)只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。假设路上到处都是新的岔口,计算最终被分成多少支队伍。

输入

第1行: 两个用空格隔开的整数:N,K,其中K表示分裂时两个队伍的奶牛数目差。

输出

1行: 输出一个整数表示最终的队伍数。

样例输入

6 2

样例输出

3

解题思路

用递归暴力,注意处理当前数值分别为单复数的情况

代码

#include
#include
using namespace std;
int n,k,s=1;
void h(int x)
{
	int l,r; 
	if(x%2==0)
	{
		l=x/2-(k+1)/2;
		r=x/2+k/2;
	}
	else 
	{
		l=(x+1)/2-(k+1)/2;
		r=(x+1)/2+k/2;
	}
	if(l+r==x&&l>=1&&r<=x&&r-l==k)
	{
		s++;
		if(l>=k+2)
			h(l);
		if(r>=k+2)
			h(r);
	}
}
int main()
{
	freopen("search.in","r",stdin);
	freopen("search.out","w",stdout);
	cin>>n>>k;
	h(n);
	cout<<s<<endl;
}

T2

题目描述

FJ想计算他的N(1<=N<=1000)只奶牛的名字的好听度,每个奶牛的名字是一个长度不超过1000的英文字母串。他创建了一个好名字的集合,数量为M(1<=M<=100),每个好名字的长度不超过30,奶牛的名字中每包含一个好名字(“包含”不一定要求连续),那么它的好听度就加1。所有的名字都不区分大小写,如名字“Bessie”包含“Be”、“sI”、“EE”、“Es”,但是不包含“eB”。
现在请你帮FJ计算每个奶牛名字的好听度。

输入

第1行: 2个用空格隔开的整数N 和 M;
第2…N+1行: 第i+1行为第i个奶牛的名字;
第N+2…N+M+1行:第N+i+1行为第i个好名字。

输出

第1…N行:第i个数为第i头奶牛名字的好听度。

样例输入

5 3
Bessie
Jonathan
Montgomery
Alicia
Angola
se
nGo
Ont

样例输出

1
1
2
0
1

解题思路

万物皆可暴力,但是如果你直接find,你会死的很惨(其实也只是少一个点而已),那么你就需要加一点“小小”的优化,废话不多说,直接上代码:

#pragma GCC optimize(2)
#include
#include
#include
using namespace std;
int n,m,s[1010],sa[1010];
string a[1010],b;
int main()
{
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sa[i]=a[i].size();
	}
	for(int i=1;i<=m;i++)
	{
		cin>>b;
		int sb=b.size(),t=0;
		for(int j=1;j<=n;j++)
		{
			t=0;
			for(int k=0;k<sa[j];k++)
				if(a[j][k]==b[t]||a[j][k]==b[t]-32||a[j][k]==b[t]+32)
				{
					t++;
					if(t==sb)
					{
						s[j]++;
						break;
					}
				}
		}
	}
	for(int i=1;i<=n;i++)
		cout<<s[i]<<endl;
}

T3

题目描述

高速公路上有N(1<=N<=50,000)只奶牛,编号为1…N,每头牛都开着自己的车,第i头牛的车速为S_i(1<=S_i<=1,000,000)km/h,告诉公路上一共有M个车道(1<=M<=N)。为了安全起见,每头牛都遵循以下原则:同车道前面有x头牛,牛的车速就会降低DX(0<=D<=5,000)KM/h,当然不会降到0以下,所以车速应该max(S_i-DX,0)。由于车距很大,所以即使后面的车比前面的车快,你也不用担心会发生碰撞。
高速公路上有一个最低限速L(1<=L<=1,000,000),凡是低于该速度的车不允许上高速,现在请你来计算一共可以多少辆车在高速公路上行驶。

输入

第1行:4个空格隔开的整数N,M,D,L;
第2…N+1行: 第i+1行描述第i头牛的起初车速。

输出

一行:输出一个整数表示最多可以在高速上行驶的牛车数量。

样例输入

3 1 1 5
5
7
5

样例输出

2

解题思路

这道题其实就是把车子尽量多的“塞”进去,那么暴力就好了

参考代码

#include
#include
#include
using namespace std;
int n,m,d,l;
int a[50010],s[50010],ans;
int main()
{
	freopen("cowcar.in","r",stdin);
	freopen("cowcar.out","w",stdout);
	cin>>n>>m>>d>>l;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i]-s[j]*d>=l)
			{
				ans++;
				s[j]++;
				break;
			}
	cout<<ans<<endl;
}

T4

题目描述

FJ在一条船上,海上有N(1<=N<=100)个岛,编号为1…N,现在他的任务是按照一个给定的访问次序A_1,A_2,….A_M去探索这M(2<=M<=10,000)个岛屿,已经知道任意两个岛屿之间的危险系数,让你找出一个探索序列,只需满足你的探索序列包含给定的A_1…A_M这个序列就可以(不一定要连续),使得总的危险系数最小。

输入

第1行:两个数, N 和 M
第 2…M+1行:第i+1行表示给定的序列中第i个岛屿A_i
第M+2…N+M+1行:每行N个整数,表示岛屿之间的危险系数,左对角线上一定是0。

输出

输出满足要求的最小危险系数

样例输入

3 4
1
2
1
3
0 5 1
5 0 2
1 2 0

样例输出

7

解题思路

用弗洛伊德求出没两个点之间的最短路,再枚举就好

参考代码

#include
#include
using namespace std;
int n,m,dis[110][110],a[10010],ans;
int main()
{
	freopen("danger.in","r",stdin);
	freopen("danger.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&dis[i][j]);
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i!=j&&i!=k&&j!=k&&dis[i][j]>dis[i][k]+dis[k][j]&&dis[i][j]!=0)
					dis[i][j]=dis[i][k]+dis[k][j];
	for(int i=1;i<m;i++)
		ans+=dis[a[i]][a[i+1]];
	cout<<ans<<endl;
}

你可能感兴趣的:(纪中)