零点工作室暑假集训(AtCoder--ABC310)

A - Order Something Else

题意: Takahashi想在餐馆里点一种名为AtCoder Drink的饮料。它的普通价格是P日元。
他还有一张折扣券,可以以更低的价格Q日元点这种饮料。然而,他必须额外点一份餐馆的N道菜品才能使用这张优惠券。对于每一个i=1,2,…,N,第i道菜品的价格是Di日元。
请打印出他必须支付的最低总金额,以获得这杯饮料。

思路: 根据题目if语句判断大小即可

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 200010, INF = 0x3f3f3f3f, mod = 998244353;

int n, p, q, ans = INF;
int a[N];

int main() 
{
    cin >> n >> p >> q;
    for(int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        ans = min(a[i], ans);
    }
    if(ans + q > p) cout << p;
    else cout << ans + q;
    
    return 0;
}

B - Strictly Superior

题意:AtCoder商店有N个产品。第i个产品(1≤i≤N)的价格是Pi日元。第i个产品(1≤i≤N)有Ci个功能。第i个产品(1≤i≤N)的第j个功能(1≤j≤Ci)用1至M之间(包括M)的整数Fi,j表示。
Takahashi想知道是否存在一种产品严格优于另一种产品。如果存在i和j (1≤i,j≤N),使得第i个产品和第j个产品满足以下所有条件,请打印Yes;否则,打印No。

  1. Pi ≥ Pj。
  2. 第j个产品具有第i个产品的所有功能。
  3. Pi > Pj,或者第j个产品具有第i个产品缺乏的一个或多个功能。

思路:先判断Pi >= Pj 然后使用for循环逐个的去判断第二个和第三个条件即可

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 110, INF = 0x3f3f3f3f, mod = 998244353;

int n, m;

int main() 
{
    cin >> n >> m;
    
    //int P[N];
    //int F[N][N];

    vector<int> P(n);
    //vector<int> v(n);定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]
    
    vector<vector<int>> F(N, vector<int>(m + 1, 0));
    //vector<vectot<int>> v;定义一个行和列均可变的二维数组
    //vector<int> v(n, 1);v[0]到v[n-1]所有的元素初始值均为1
    //注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

    for (int i = 0; i < n; i ++) 
    {
        cin >> P[i];
        int C;
        cin >> C;
        for (int j = 0; j < C; j ++) 
        {
            int f;
            cin >> f;
            F[i][f] = 1;
        }
    }

    string ans = "No";

    for (int i = 0; i < n; i ++) 
    {
        for (int j = 0; j < n; j ++) 
        {
            if (P[i] >= P[j] && i != j) //判断第一个条件是否成立
            {
                bool flag1 = true;
                bool flag2 = false;

                for (int k = 1; k <= n; k ++) 
                {
                    if (F[i][k] == 1 && F[j][k] == 0)//判断的是第j个产品是否具有第i个产品的所有功能 
                    {                                //若第j个产品不具有第i个产品的所有功能,则falg1 = false
                        flag1 = false;
                    }
                    if (F[i][k] == 0 && F[j][k] == 1) //判断的是第j个产品是否具有第i个产品缺少的一个或多个功能
                    {                                 //若第j个产品具有第i个产品缺少的一个或多个功能,flag2 = true;
                        flag2 = true;
                    }
                }

                if (flag1 && (P[i] > P[j] || flag2))//判断第二和第三个条件是否成立 
                {
                    ans = "Yes";
                    break;//跳出的是j的循环
                }
            }
        }
        
        if (ans == "Yes") 
        {
            break;
        }
    }

    cout << ans << endl;

    return 0;
}

C - Reversible

题意: 有N根棍子,上面插着几个小球。每个小球上都写着一个小写英文字母。
对于每个i=1,2,…,N,插在第i根棍子上的小球上的字母由一个字符串Si表示。具体来说,第i根棍子上插着的小球的数量是字符串Si的长度∣Si∣,而Si是从棍子的一端开始的字母序列。
当从一根棍子的一端开始的字母序列等于从另一根棍子的一端开始的字母序列时,这两根棍子被认为是相同的。更具体地说,对于1到N之间的整数i和j(包括N),当且仅当Si等于Sj或其颠倒时,第i根和第j根棍子被视为相同。
打印出N根棍子中不同的棍子数量。

思路: 反转字符串的意思,然后使用set容器储存。因为set容器不允许存取相同的字符进去可以判断字符相等的时候
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 110, INF = 0x3f3f3f3f, mod = 998244353;

int n;

int main() 
{
    cin >> n;
    
    set<string> S;
    
    for (int i = 0; i < n; i ++) 
    {
        string s;
        cin >> s;
        
        string s1 = s;
        reverse(s1.begin(), s1.end());
        
        if (S.find(s1) == S.end()) //s1不在set<string> S中
        {
            S.insert(s);
        }
    }
    
    cout << S.size() << endl;
    
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值