Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)

A Optimal Currency Exchange

传送门
其实就是一个完全背包问题
输入n表示背包大小,d表示物件1,e表示物件2
但是由于购买限制,所以d必须是1的倍数,e是5的倍数
所以只要把e的价格乘5,然后再看出完全背包问题即可

#include <iostream>
#include <cstdio>
using namespace std;
int w[5];
int v[5];
const int N=1e8+5;
int dp[N];
int main(){
    int n,d,e;
    cin>>n>>d>>e;
    w[1]=v[1]=d;
    w[2]=v[2]=5*e;
    for (int i = 1; i <= 2; i++) {
        for (int j = w[i]; j <= n; j++) {
            dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
        }
    }
    printf("%d\n",n-dp[n]);
    return 0;
}

B Badges

已知存在b个boy,g个girl以及n个人是参加比赛的,这n个人是b+g中来的,而参加比赛的话男孩子需要蓝色,女孩子需要红色的牌子,而举办人不知道会有多少男孩子和女孩子,所以需要求出最小的牌子数

传送门
就是贪心,red牌子的数要≤g,blue的牌子的数要≤b,枚举即可

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int b,g,n;
    cin>>b>>g>>n;
    int cnt=0;
    for(int i=0;i<=n;i++){
        int x=n-i;
        if(i<=b&&x<=g){
            cnt++;
        }
    }
    printf("%d\n",cnt);
    return 0;
}

C Bad Sequence

传送门
可以用栈去匹配,而大佬是思维去理解
n如果是奇数,那么必定无法匹配,如果是偶数就可能匹配成功,而且要使得'('的数量等于')',最后如果一组"()"能匹配成功,左括号必须在右括号前面
在前面的基础上,如果

所以先判断n是否为偶数,不是就输出No
然后查看'('和')'d的数,是否相等
最后统计(

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    string s;
    cin>>n>>s;
    if(n%2==1){
        printf("No\n");
    }else{
        if(count(s.begin(),s.end(),'(')!=count(s.begin(),s.end(),')')){
            printf("No\n");
            return 0;
        }
        int low=0,pre=0;
        for(char ch : s) low=min(low,ch=='('?++pre:--pre);//在匹配完后如果还是存在连续两个或两个以上)就会输出No
        printf("%s\n",low>=-1?"Yes":"No");
    }
    return 0;
}
/*
)))(((只要出现连续两个)在(的前面,那么就不能匹配了,如果low是-1,那么还可以换一个位置,匹配
*/

猜你喜欢

转载自www.cnblogs.com/Emcikem/p/11463059.html
今日推荐