第一次授课内容

第一题

涵哥和杰少非常喜欢吃面条,经常结伴去面馆。一碗面条售价20元,有三种配料(鸡蛋、牛肉、鸡腿),每种配料加10元。顾客点了一碗拉面,并告诉店员他要在拉面上放什么配料。老板拿了一张纸,在上面写着一个字符串S.
字符串S由三个字母组成,如果字符串S中的第一个字母是o,这意味着拉面应该放上鸡蛋;如果这个字母是x,这意味着拉面上不应该加鸡蛋。同样,字符串S中的第二个和第三个字母表示在拉面上是否有牛肉片和鸡腿。
写一个程序,在给出字符串S的时候,输出拉面相应的价格。
输入
输入一个字符串S
条件:
字符串S由3个字母组成每个字母是o或者x
输出
输出字符串S相对应的拉面价格
样例:

oxo
40

ooo
50

xxx
20

代码:

#include <bits/stdc++.h>
using namespace std;

signed main()
{
    char s[5];
    cin >> s;
    int num = 0;
    for(int i = 0;i<3;i++)
        if(s[i] == 'o')
            num++;
    cout << num * 10 + 20;
}

第二题

杰少是一名糕点师,他使用鸡蛋和面粉可以做N种蛋糕。这些蛋糕被称为蛋糕1,蛋糕2,..蛋糕N。做一个蛋糕i (1 \(\le\) i \(\le\) N)需要消耗mi克面粉。他不能制作非整数数量的蛋糕,例如不能制作0.5个蛋糕。
现在,有X克面粉,他决定为今晚的聚会做尽可能多的蛋糕。然而,由于客人的口味不同,她将遭守以下条件:对于N种蛋糕中的每一种,至少制作一个蛋糕。
最多可以做多少个蛋糕,并不要消耗掉所有的面粉。
输入
第一行输入两个整数:N X输入N 行,每行一个整数mi
输入格式如下:
\(N X\)

\(m_1\)

\(m_2\)

\(m_N\)
条件:
\(2≤N≤100 1≤mi≤1000\)
\(m_1+m_2+ ...+m_N≤X≤10^5\)
输出
输出在这个条件下制作蛋糕的最大数量
样例:

3 1000
120
100
140
9

4 360
90
90
90
90
4

5 3000
150
130
150
130
110
26

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
#define int long long
int a[N];
signed main()
{
    int n, x;
    cin >> n >> x;
    int mi = 100000;
    int sum = 0;
    for(int i = 0;i<n;i++)
        cin >> a[i], mi = min(mi, a[i]), sum +=a[i];
    cout << ((x - sum) - 1) / mi + n;
}

第三题

某连锁快餐店提供三种披萨:A-pizza,B-pizza和AB-pizza。A-pizza和B-pizza是完全不同的披萨,而AB-pizza是A-pizza的一半和B-pizza的一半组成的。三种披萨的价格分别是A元,B元和C元
杰少为了今天晚上的跟会,要准备X个A-pizza和Y个B-pizza。他可以直按购买A-pizza和B-pizza,或者购买两个AB-pizza来新组成一个A-pizza和一个B-pizza,通过这几种方式购买,最少要花费多少元注意:新组装的披萨数量可以比需要的数量多,但是花费不能多,这样可以吃到更多的披萨。
输入
输入5个整数:\(A\) \(B\) \(C\) \(X\) \(Y\)
条件:
\(1 \le A,B,C \le 5000\)
\(1 \le X,Y \le 10^5\)
输出
输出需要准备的披萨最少需要花费多少元

样例:

1500 2000 1600
3 2
7900

1500 2000 1900
3 2
8500

1500 2000 500
90000 100000
100000000

代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a, b, c, x, y;
    cin >> a >> b >> c >> x >> y;
    if (a + b <= 2 * c)
        cout << x * a + y * b;
    else
    {
        if (x < y)
            swap(x, y), swap(a, b);
        if (a > 2 * c)
            a = 2 * c;
        cout << y * c * 2 + (x - y) * a;
    }
}

第四题

餐厅里有—张圆环形餐桌,餐桌的外周长是C米,顾客不能进入到餐桌里面。
现在餐桌上有N块蛋糕,从你站立的点上,顺时针开始测量到下一个蛋糕放置的点距离是xi米,第个站点上的蛋糕的营养价值是vi千卡。
你可以顺时针或者逆时针走,但是不允许回头走。当你走到蛋糕放置的地方时,可以吃掉蛋糕增加营养,蛋糕会消失。在行走时,每走1米消耗1千卡营养.
只要你想离开,随时可以从任意点上离开,不必回到最初的位置上。总的来说,就是在你离开餐桌前,能够得到最多多少营荞。也就是说,得到的营养值减去消耗的营荞值最大可能值是多少?假设没有其它的顾客,蛋糕也不会增加。在你的身体里有充足的营养,无论走多少路,消耗多少营养,都不会被饿死。
输入
输入第一行两个整数:\(N\) \(c\)
从第二行开始输入\(N\)行,\(x_i\) \(v_i\)输入格式如下:
\(N\) \(c\)
\(x_1\) \(v_1\)
\(x_2\) \(v_2\)
\(x_N\) \(v_N\)
条件:\(1≤N≤104\)
\(2≤C≤10^5\)
\(1≤x_1<x_2<...<x_N<C\)
\(1≤v_i≤104\)
样例:

3 20
2 80
9 120
16 1
191

3 20
2 1
9 80
16 120
189

代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a[100010], b[100010];
	int n, p;
	cin >> n >> p;
	for (int i = 0; i < n; i++)
		cin >> a[i] >> b[i];
	int ans = 0, now = 0;
	for (int i = 0; i < n; i++)
		ans = max(ans, now + b[i] - a[i]), now += b[i];
	now = 0;
	for (int i = n; i >= 0; i--)
		ans = max(ans, now + b[i] - (p - a[i])), now += b[i];
	cout << ans;
}

117. 分糖果

题目链接
老师组织一群孩子围成一个圈进行游戏,游戏结束后老师会根据每个 孩子的表现进行评分并给予糖果奖励。每个孩子只能看见与自己相邻的 2 个孩子(左边的和右边的)的情况, 只会关心相邻的且比自己评分低的同学的糖果数(如果相邻 2 个孩子的评分 相等,则不关心)。为保证公平,相邻的孩子中,评分高的孩子必须获得更 多的糖果(如果左右相邻 2 个孩子的评分相等,则不关心,即分最少的糖果 1 个)。同时,为鼓励孩子的积极性,每个孩子至少都能拿到 1 个糖果。 现在需要你帮助老师来分发糖果,问怎么分配才能使要准备的糖果数 最少?计算出需要的最少糖果数。
输入:
输入有二行,第一行一个正整数 n 表示孩子的个数。 第二行 n 个非负整数,相邻的数用空格隔开,分别表示孩子的表现评分。
输出:
一个整数,表示最少需要准备的糖果数。
样例:

3
1 2 0
6

4
2 3 3 3
6

条件:
\(1<=n<=100000; 所有评分都是 0 到 100 之间的一个整数。\)
代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e6 + 10;
#define int long long
struct node
{
    int val, weizhi;
} a[N];
int b[N];
bool cmp(node a, node b)
{
    return a.val < b.val;
}
int num[N];
signed main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].val;
        b[i] = a[i].val;
        a[i].weizhi = i;
    }
    b[0] = b[n];
    b[n + 1] = b[1];
    a[0] = a[n];
    a[n + 1] = a[0];

    sort(a + 1, a + n + 1, cmp);

    for (int i = 1; i <= n; i++)
    {
        int id = a[i].weizhi;
        if (num[id - 1] == 0 && num[id + 1] == 0)
            num[id] = 1;

        if (b[id] > b[id - 1])
            num[id] = max(num[id - 1] + 1, num[id]);

        if (b[id] > b[id + 1])
            num[id] = max(num[id + 1] + 1, num[id]);

        if (b[id] <= b[id - 1] && b[id] <= b[id + 1])
            num[id] = 1;
        if (id == 1)
            num[n + 1] = num[id];
        else if (id == n)
            num[0] = num[id];
    }
    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans += num[i];
    cout << ans << endl;
    return 0;
}
posted @ 2022-10-23 10:31  zzh1206  阅读(48)  评论(0)    收藏  举报