2020.3.14 C组模拟赛题解

目录:

T1:探索的奶牛
T2:单词
T3:牛车
T4:危险系数

正题:

T1:探索的奶牛

题目描述

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

输入

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

输出

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

样例输入

6 2

样例输出

3

分析:

这道题就是一道简化的和差问题

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans;
void dfs(int x){  //爆搜,和差
	if((x+k)%2==0&&x-k>0){
		ans++;
		dfs((x+k)/2);
		dfs((x-k)/2);
	}
}
int main(){
	freopen("search.in","r",stdin);
	freopen("search.out","w",stdout);
	cin>>n>>k;
	ans++; //ans初值为1
	dfs(n);
	cout<<ans;
	return 0;
}

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

分析:

这道题就是模拟,暴力枚举过就可以。
要找一些c++转大小写的函数,一些位数少编译器还编译不了。

CODE:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char a[1001][1001],b[201][1001];
int g[1001],d[201],n,f,k,ans;
int main()
{
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	cin>>n>>f;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		g[i]=strlen(a[i]);
		for(int j=0;j<g[i];j++)
			a[i][j]=tolower(a[i][j]);  //转大小写函数
	}
	for(int i=1;i<=f;i++)
	{
		cin>>b[i];
		d[i]=strlen(b[i]);
		for(int j=0;j<d[i];j++)
			b[i][j]=tolower(b[i][j]); //第二次转小写
	}
	for(int i=1;i<=n;i++)
	{
		ans=0;
		for(int j=1;j<=f;j++)
		{
			k=0;
			for(int k=0;k<g[i];k++)
				if(a[i][k]==b[j][k])k++;   //匹配
			if(k>=d[j]) ans++; //符合条件	
		}
		cout<<ans<<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

分析:

这题我们就先对车的速度从小到大排序
因为排序保证了结果的最优,所以枚举每个车速,一个赛道,能放就放,不能就新开一条车道,车道满了或者每个车道都低于限速就走。

CODE:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int m,n,k,p,a[50100],b[50100];
int main(){
	freopen("cowcar.in","r",stdin);
	freopen("cowcar.out","w",stdout);
	cin>>n>>m>>k>>p;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+1+n);  //排序,保证最优
	int j=1,ans=0;
	for(int i=1;i<=n;i++,j++){
		if(j>m)  //不能放
			j=1;
		if(a[i]-b[j]*k>=p){
		//能放就放
			b[j]++;
			ans++; //放了
		}
	}
	cout<<ans;
	return 0;
}

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

分析:

这道题就是一道最短路
我们要找的最小值
就是a1到a2的最短路,a2到a3的最短路,a3到a4的最短路,a5到……的总和。
所以就很容易做了,
一个floyd直接求和。

CODE:

#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int f[10001][10001],c[10001];
int ans,i,j,k,n,m;
int main(){
	cin>>n>>m;
	for(i=1;i<=m;i++) cin>>c[i];
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++) cin>>f[i][j];  //读入
	}
	for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	if(i!=j&&i!=k&&j!=k) //松弛条件
	f[i][j]=min(f[i][j],f[i][k]+f[k][j]);  //Floyd
	ans=0;
	for(i=1;i<m;i++)
	ans=ans+f[c[i]][c[i+1]];  //累加最短路
	cout<<ans;
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值