目录:
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;
}