CSDN第二十八期周赛

1、题目名称:小Q的鲜榨柠檬汁 团建活动是大家所想要的。 小Q给大家准备了鲜橙汁。 现在有n个朋友买回了k瓶饮料,每瓶有l毫升的饮料,同时还买回 了c个柠檬, 每个柠檬可以切成d片,p克盐。 已知每个朋友需要nl毫升的饮料,一片柠檬,以及np克盐。 小Q想知道每 个朋友最少可以喝多少杯饮料。

这道题目直接模拟就ok了。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std ;
typedef long long LL ;
LL n , k , l , c , d , p , nl , np ;
int main() {
    cin >> n >> k >> l >> c >> d >> p >> nl >> np ;
    LL a = k * l / nl / n ;
    LL b = c * d / n ;
    LL c = p / np / n ;
    LL res = min(a , b) ;
    cout << min(res , c) << endl ;
return 0;
}

2、题目名称:三而竭 一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。 小艺接到一个任务,任务的总任务量是n。 第一天小艺能完成x份 任务。 第二天能完成x/k。 。。。 第t天能完成x/(k^(t-1))。 小艺想知道自己第一天至少完成多少才能完成最后的任务。

如果能想到二分,这道题也会变得比较容易,但如果在数学思维方面思考可能就有点偏了,因为每天完成的任务是整数个,所以用数学公式推到就会出现错误。那么如何用二分解决呢?

我们二分答案,对于每次二分出来的答案,进行累加,直到有一天任务完成为0,return 累计值>=n

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <cmath>
using namespace std ;
int n , k ;
bool check(int mid)
{
    int s = 0 ;
    while(mid)
    {
    s += mid ;
    mid /= k ;
    }
    
    return s >= n ;
}
int main() {
    cin >> n >> k ;
    int l = 0 , r = n ;
    while(r > l)
    {
    int mid = l + r >> 1 ;
    if(check(mid)) r = mid ;
    else l = mid + 1 ;
    }
    cout << r << endl ;
    return 0;
}

3、题目名称:隧道逃生 小海豚喜欢打游戏,现在它在操纵游戏人物小C逃脱废弃的隧道,逃生装置在小C的前方 X 米远的位置。但是游戏机只有 两个按钮:前进和后退,按前进,小C会前进 m 米,按后退,小C会后退 n 米。 小海豚必须设法把小C送到逃生装置上, 方能逃离隧道,请你帮帮小海豚,告诉它至少要操作多少次,才能通关。

因为恰好要走到前方x米处,因此我们假设前进a布,后退b布。得到公式am - bn = x。然后枚举就可以了,这道题结束了。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std ;
int x , m , n , res = 1e9 ;
int main() {
    cin >> x >> m >> n ;
    for(int i = 0 ; i <= 1000 ; i ++)
    for(int j = 0 ; j <= 1000 ; j ++)
    {
    if(m * i - n * j == x) res = min(res , i + j) ;
    }
    cout << res << endl ;
return 0;
}

4、题目名称:收件邮箱 已知字符串str,str表示邮箱的不标准格式。 其中”.”会被记录成”dot”,”@”记录成”at”。 写一个程序将str转化成可用 的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)

这道题在思维上是没有什么难度的,难一点的地方可能在代码实现上,提供一种C++的实现方式,用Java或者python的话,代码应该会更短一些。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std ;
string s , res , u ;
int main() {
    cin >> s ;
    int a = 0 ;
    int n = s.size() ;
    
    for(int i = 0 ; i < n ; i ++)
    {
    string t = s.substr(i , 2) ;
    if(t == "at" && i != 0 && i != n - 2 && a == 0)
    {
    u += "@" ;
    i ++ ;
    a = 1 ;
    }
    else u += s[i] ;
    }
    s = u ;
    n = s.size() ;
    for(int i = 0 ; i < n ; i ++)
    {
    string t = s.substr(i , 3) ;
    if(t == "dot" && i != 0 && i != n - 3)
    {
    res += "." ;
    i += 2 ;
    }
    else res += s[i] ;
    }
    cout << res << endl ;
return 0;
}

希望大家下期周赛取得优异成绩!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安特尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值