笔试强训day19

小易的升级之路

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?

输入描述:

对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力

输出描述:

对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值

#include <iostream>

using namespace std;

int gcd(int a, int b)  
{
    return b ? gcd(b, a % b) : a;
}
int n, a;


int main()
{
    while (cin >> n >> a)
    {
        for (int i = 0; i < n; ++i)
        {
            int x;
            cin >> x;
            if (x <= a)a += x;
            else a += gcd(a, x);
        }
        cout << a << '\n';
    }
    return 0;
}

礼物的最大价值

在一个�×�m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

如输入这样的一个二维数组,
[
[1,3,1],
[1,5,1],
[4,2,1]
]

那么路径 1→3→5→2→1 可以拿到最多价值的礼物,价值为12

class Solution {
    int dp[210][210]{};
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        int n = grid.size(),m = grid[0].size();
        for(int i = 1;i<=n;++i)
        {
            for(int j = 1;j<=m;++j)
            {
                dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + grid[i-1][j-1];
            }
        }
        return dp[n][m];
    }
};

对称之美

给出n个字符串,从第1个字符串一直到第n个字符串每个串取一个字母来构成一个新字符串,新字符串的第i个字母只能从第i行的字符串中选出,这样就得到了一个新的长度为n的字符串,请问这个字符串是否有可能为回文字符串?

输入描述:

第一行一个数字 t,1≤t≤50t ,1\le t \le50t,1≤t≤50,代表测试数据的组数

每组测试数据先给出一个数字 n,然后接下来n行每行一个只由小写字母组成的字符串 sis_isi

1≤n≤100,1≤∣si∣≤501 \le n \le 100, 1\le |s_i| \le501≤n≤100,1≤∣si∣≤50

输出描述:

在一行中输出 “Yes” or “No”
#include <iostream>
#include <string>

using namespace std;
const int N = 110;
bool check(string& s, string t)
{
    int hx1[26]{}, hx2[26]{};
    for (auto& c : s)hx1[c - 'a']++;
    for (auto& c : t)hx2[c - 'a']++;
    for (int i = 0; i < 26; ++i)
        if (hx1[i] && hx2[i])return true;
    return false;
}

string s[N];

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        for (int i = 0; i < n; ++i)cin >> s[i];
        int left = 0, right = n - 1;
        bool flag = true;
        while (left < right)
        {
            if (check(s[left], s[right]))left++, right--;
            else {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值