详谈Codeforces Round #608 (Div. 2)ABC题解

A题 Suits

思路:贪心就好了,谁大就用谁

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx=1e5+10;
const double PI=cos(-1.0);
int main()
{
    int a,b,c,d,e,f,ans=0,x;
    cin>>a>>b>>c>>d>>e>>f;
    if(e>=f)
    {
        x=min(a,d);
        a-=x;
        d-=x;
        ans+=x*e;
        ans+=min(b,min(c,d))*f;
    }
    else
    {
        x=min(b,min(c,d));
        b-=x;
        c-=x;
        d-=x;
        ans=x*f;
        ans+=min(a,d)*e;
    }
    cout<<ans<<endl;
   return 0;
}

B题 Blocks

思路:也是贪心,看能不能全部变成白色或者黑色(如果是全变成白色,那么遇见黑色就变白色,相当于把黑色一直移到后面去,看最后一个是不是白色既可。全变成黑色同理),否则为-1.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx=1e5+10;
const double PI=cos(-1.0);
map<char,char> vs;
int a[mx];
int main()
{
   int n,m=0,len,t;
   string s,s1;
   cin>>n>>s;
   vs['B']='W';
   vs['W']='B';
   s1=s;
   t=0;
   for(int i=0;i<n-1;i++)
   {
       if(s[i]=='B')
       {
           a[m++]=i+1;
           s[i]=vs[s[i]];
           s[i+1]=vs[s[i+1]];
       }
   }
   if(s[n-1]=='W')
   {
       cout<<m<<endl;
       for(int i=0;i<m;i++)
        cout<<a[i]<<" ";
       cout<<endl;
       return 0;
   }
   t=m=0;
   for(int i=0;i<n-1;i++)
   {
       if(s1[i]=='W')
       {
           a[m++]=i+1;
           s1[i]=vs[s1[i]];
           s1[i+1]=vs[s1[i+1]];
       }
   }
    if(s1[n-1]=='B')
   {
       cout<<m<<endl;
       for(int i=0;i<m;i++)
        cout<<a[i]<<" ";
       cout<<endl;
       return 0;
   }
   cout<<-1<<endl;
   return 0;
}

C题 Shawarma Tent

思路:最后到这个点,无非就是它的上,下,左,右,四个点,那我们只要,判断在上,下,左,右的对应有几个同学选择最大的人数,既可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx=2e5+10;
map<int,int>vs;
int main()
{
    int n,x,y,l,r,ans,sum;
     cin>>n>>x>>y;
     for(int i=1;i<=n;i++)
     {
         scanf("%d%d",&l,&r);
         if(x+1<=l) vs[1]++;//右
         if(x-1>=l) vs[2]++;//左
         if(y+1<=r) vs[3]++;//上
         if(y-1>=r) vs[4]++;//下
     }
 
     ans=0,sum=0;
     for(int i=1;i<=4;i++)
     {
         if(ans<vs[i])
         {
             ans=vs[i];
             sum=i;
         }
     }
     cout<<ans<<endl;
     if(sum==1)
        printf("%d %d\n",x+1,y);
     if(sum==2)
        printf("%d %d\n",x-1,y);
     if(sum==3)
        printf("%d %d\n",x,y+1);
     if(sum==4)
        printf("%d %d\n",x,y-1);
   return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值