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

A. Optimal Currency Exchange

就是汇率问题,不难发现,我们其实只要换 d o l l a r dollar dollar e u r o euro euro的最小面值即可,也就是1,和5,其他面值可以通过这两个比例得到,所以问题就简化了。
于是暴力即可

#include <iostream>
using namespace std;
int main()
{
    int n;  cin >> n;
    int d,e;    cin >> d >> e;
    if(n%d==0 || n%(5*e)==0)    n = 0;
    else{
        int temp = n;
        for(int i = 0; i <= n/(5*e); ++i){
            temp = min(temp,(n - i*5*e)%d);
        }
        n = temp;
    }
    cout << n << endl;
    return 0;
}

B. Badges

题意:
有b个男生,g个女生,现在有n个人来了会场,有n+1种包,每一个包中 有 i个蓝色徽章(给男生的), n-i个红色徽章(给女生的)

考虑一下,可以发现,当现在的包中有一项大于b或者g的时候,就可能会出现问题,因为多出来的那些徽章没用,那么就可以得到另一种徽章需要的个数,如果此时不满足,那么这个包就不需要,反之需要(看代码)

#include <iostream>
using namespace std;
int main(){
    int b,g,n;  cin >> b >> g >> n;
    int tot = 0;
    for(int i = 0; i <= n; ++i){
        if( ( (i > b) && (n-i < n - b)) || (( (n-i > g) && (i < n-g) ))) {
            continue;
        }
        tot++;
    }
    cout << tot << endl;
 
    return 0;
}

C. Bad Sequence
也就是个括号匹配,如果能匹配成功那么就消去这对括号,然后去判断剩余括号的个数和种类
因为题意中可以移动一个括号,那么也就是当括号个数==2时,并且是 )( 情况的时候成立(看代码把)

 #include <iostream>
using namespace std;
char arr[20000000];
int main(){
    int n;  cin >> n;
    int head = 0;
    for(int i = 0; i < n; ++i){
        char c; cin >> c;
        if(!i)  arr[head++] = c;
        else{
            if(c==')'){
                if(arr[head-1]=='(') head--;
                else arr[head++] = c;
            }
            else if(c=='('){
                arr[head++] = c;
            }
        }
    }
    if(head==1 || head > 2){
        cout << "No" << endl;
    }
    else if(head==2){
        if(arr[0]==')' && arr[1] == '('){
            cout << "Yes" << endl;
        }
        else cout << "No" << endl;
    }
    else cout << "Yes" << endl;
    return 0;
}

D. Treasure Island

最少放多少个障碍物使得该图无法从 ( 1 , 1 ) − &gt; ( n , m ) (1,1) -&gt;(n,m) (1,1)>(n,m)
很容易直观想到堵住入口或出口(ans<=2),然后再跑两遍dfs,去确定是不是只有一条路可以走或者无路可走
然后取最小值就可以了,至于建图问题,只需要记录那些障碍物的 ( x , y ) (x,y) (x,y)即可,用set保存。

#include <iostream>
#include <set>
using namespace std;
const int maxn = 1e6;
set<pair<int,int>>st;   // 存那些走不了的点
long long ans;
int n,m;
bool isfind = false;
void dfs(int x,int y){
    if(x < 1 || x > n || y < 1 || y > m)
        return;
    if(x==n&&y==m){
        ans++;
        isfind = true;
        return;
    }
    if(isfind)  return;
    if(st.count(make_pair(x,y)))    return;
    if(x!=1 || y!=1)
        st.insert(make_pair(x,y));
    dfs(x+1,y);
    dfs(x,y+1);
}
int main()
{
    cin >> n >> m;
    bool gg[4] = {false,false,false,false};
    getchar();
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            char c = getchar();
            if(c=='#'){
                st.insert(make_pair(i,j));
                if(i==2 && j==1){   // 看左上角和右下角
                    gg[0] = 1;
                }
                else if(i==1 && j==2){
                    gg[1] = 1;
                }else if(i==n-1 && j ==m)
                    gg[2] = 1;
                else if(i==n && j == m-1)
                    gg[3] = 1;
            }
        }
        getchar();
    }
    if((gg[0] && gg[1]) || (gg[2] && gg[3])){
        cout << 0 << endl;
        return 0;
    }
    dfs(1,1);   // 跑DFS看有几条通路
    isfind = false;
    dfs(1,1);   // 跑DFS看有几条通路
    if(gg[0] || gg[1])
        ans = min(ans,1ll);
    if(gg[2] || gg[3])
        ans = min(ans,1ll);
    cout << min(ans,2ll) << endl;
    return 0;
}

后面的题目待补

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值