Codeforces Round #608 (Div. 2)(ABCD题解)全是暴力,D是dp和贪心

A. Suits(枚举,老套路了)

题意:

有四种商品,分别有a,b,c,d个。
现在有两种选择。

  1. 选a和d,盈利是e。
  2. 选b,c和d,盈利是f


怎样分配商品可以赚最多。

思路:

枚举(老套路了),

这里有一个进阶版

其实这种套路是一种枚举的思路。

AC(强烈推荐学习枚举,老套路了)

#include <iostream>
using namespace std;
int main()
{
    int a,b,c,d,e,f;
    cin>>a>>b>>c>>d>>e>>f;
    int ans=0;
    for(int num1=0; num1<=min(a,d); num1++){
        int tmp=num1*e;
        int num2=min(d-num1,min(b,c));
        tmp+=num2*f;
        ans=max(tmp,ans);
    }
    cout<<ans<<endl;
    return 0;
}

AC(暴力if,枚举外做法,不推荐,容易错

#include <iostream>
using namespace std;
int main()
{
    int a[7];
    for(int i=1; i<=6; i++)cin>>a[i];
    int ans=0,num;
    if(a[5]>a[6]){
        num=min(a[1],a[4]);
        a[4]-=num;
        a[1]-=num;
        ans+=num*a[5];
    }
    if(a[4]){
        num=min(a[2],min(a[3],a[4]));
        a[4]-=num;
        ans+=a[6]*num;
    }
    if(a[4]){
        num=min(a[1],a[4]);
        a[4]-=num;
        a[1]-=num;
        ans+=num*a[5];
    }
    cout<<ans<<endl;
    return 0;
}

B. Blocks(又是暴力)

题意:

有黑白块块,问你是否可以经过操作,使得所有块的颜色相同。
每次可以选择改变两个相邻块的颜色。

思路:

暴力。枚举改变哪种颜色。
之后直接改变就行了

AC(赛后)

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    string s;
    int n;cin>>n;
    cin>>s;
    for(auto &c:s)c=(c=='B')?1:0;
    for(int col=0; col<2; col++){//枚举全变为1,还是变为0.
        string t=s;
        vector<int>ans;
        for(int i=0; i+1<n; i++){
            if(t[i]!=col){
                t[i]=col;
                t[i+1]^=1;
                ans.push_back(i);
            }
        }
        if(t.back()==col){
            cout<<ans.size()<<endl;
            for(auto x:ans)cout<<x+1<<' ';
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}

AC(赛中,思路一样,不过很多废话)

#include <iostream>
#include <vector>
using namespace std;
char s[300];
int a[300],n;
vector<int>ans;
bool check1(){
    int cnt=0;
    for(int i=1; i<=n; i++)if(a[i]==1)cnt++;
    return cnt==n;
}
bool check2(){
    int cnt=0;
    for(int i=1; i<=n; i++)if(a[i]==0)cnt++;
    return cnt==n;
}
void work(int op){
    int cnt=0;
    while(1){
        if(op){
            if(check1())break;
        }else {
            if(check2())break;
        }
        for(int i=1; i<=n; i++){
            if(a[i]!=op){
                if(a[i+1]!=a[i])swap(a[i],a[i+1]);
                else a[i]=a[i+1]=op;
                ans.push_back(i);
                break;
            }
        }
        cnt++;
    }
    cout<<cnt<<endl;
    for(int i=0; i<ans.size(); i++)cout<<ans[i]<<' ';
    cout<<endl;
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n;
    cin>>(s+1);
    for(int i=1; i<=n; i++)a[i]=(s[i]=='B')?1:0;
    int cnt1=0,cnt0=0;
    for(int i=1; i<=n; i++){
        if(a[i])cnt1++;
        else cnt0++;
    }
    if(cnt1==0||cnt0==0){
        cout<<0<<endl;
    }else if(n%2==0&& (cnt1&1) ){
        cout<<-1<<endl;
    }else {
        if(cnt1%2==0)work(0);
        else work(1);
    }
    return 0;
}

C. Shawarma Tent(枚举)

题意:

在二维空间内,有很多个点,有一个点是学校。
学生会从学校回家,且都会走笛卡尔最短路。

设置一个店Shawarma,使得有最多的学生放学可以经过。

思路:

可以先看学校。
那么可能的点只有四个。枚举哪种情况最优即可。
(sx+1,sy)(sx-1,sy)(sx,sy+1)(sx,sy-1)

AC

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=2e5+10;
struct point{
    int x,y;
}p[maxn];
int getdis(int x1, int y1,int x2,int y2){
    return abs(x1-x2)+abs(y1-y2);
}
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n;cin>>n;
    int sx,sy;
    cin>>sx>>sy;
    for(int i=1; i<=n; i++)cin>>p[i].x>>p[i].y;
    int ans=0,ansx,ansy;
    for(int i=0; i<4; i++){
        int tx=sx+dx[i],ty=sy+dy[i];
        int cnt=0;
        for(int i=1; i<=n; i++){
            if(getdis(tx,ty,p[i].x,p[i].y)+1==getdis(sx,sy,p[i].x,p[i].y))cnt++;
        }
        if(cnt>ans){
            ans=cnt;ansx=tx;ansy=ty;
        }
    }
    cout<<ans<<endl;
    cout<<ansx<<' '<<ansy<<endl;
    return 0;
}

D. Portals

题解地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值