CSDN竞赛第40期题解

CSDN竞赛第40期题解

1、题目名称:小鱼的航程(改进版)

有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7)开始
算起,请问这样过了n天以后,小鱼一共累计游泳了多少公里呢?

ll x,n;cin>>x>>n;
ll t = n/7;
ll y = t*5*(100+150);
n%=7;
for(int i=0,j=x;i<n;i++,j=j%7+1){
    
    
if(j<6) y+=250;
}
cout<<y;

2、题目名称:编码

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。 字母
表中共有26个字母{a,b,…,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的长度相同的单词放在
一起,按字典顺序排列,一个单词的编码就对应着它在整个序列中的位置。 你的任务就是对于所给的单词,求出它的编

string s;cin>>s;
int n=s.size();
for(int i=1;i<n;i++)
if(s[i]<=s[i-1]){
    
    
return puts("0"),0;
}
ll res = 0;
for(int i=1;i<n;i++) res+=f(26,i);
for(int x=0;x<n;++x){
    
    
for(char ch=(x==0?'a':s[x-1]+1);ch<s[x];ch++){
    
    
res+=f('z'-ch,n-x-1);
}
}
res++;
cout<<res;

3、题目名称:一维数组的最大子数组和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组,输出该子数组在原数组中的开始下标和结束下标。原数组
下标从0开始

ll s= 0;
int n;cin>>n;
rep(i,0,n-1){
    
    
cin>>a[i];
}
ll ans = -1e15;
ll st=0,cur=0,ed=0;
for(int i=0;i<n;i++){
    
    
if(s<0){
    
    
s=a[i];
cur=i;
}
else{
    
    
s+=a[i];
}
if(s>ans){
    
    
ans=s;
st=cur;
ed=i;
}
}
printf("%lld %lld\n",st,ed);

4、题目名称:喜水青蛙

总是喜欢在水里嬉戏的青蛙,某天要过河拜访一位朋友。
已知河道中长满了带刺的不知名生物,能通过的路只有一条直线,长度为L。
直线上随机分布着m块石头。青蛙的最小跳跃距离是s,最大跳跃距离是t。
青蛙想要尽可能的少踩石头,那么它通过河道最少会踩到多少石头?

int l;
int n,s,t;
scanf("%d%d%d%d",&l,&s,&t,&n);
rep(i,1,n) scanf("%d",&a[i]);
if(s==t){
    
    
int cnt = 0;
rep(i,1,n) if(a[i]%s==0) cnt++;
printf("%d\n",cnt);return 0;
}
int dis = s*t;
sort(a+1,a+n+1);
int x = 0;
rep(i,1,n){
    
    
if(a[i]-a[i-1]>dis) x+=dis;
else x+=a[i]-a[i-1];
vis[x] = 1;
}
mst(f,0x3f);
f[0] = 0;
for(int i=1;i<=x+t;i++){
    
    
for(int j=s;j<=t;j++){
    
    
if(i>=j) f[i] = min(f[i],f[i-j]+vis[i]);
}
}
int ans = 1e9;
for(int i=x;i<=x+t;i++)
cmn(ans,f[i]);
printf("%d\n",ans);
return 0;

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/129822347