Codeforces Round #469 (Div.2)

15 篇文章 0 订阅
10 篇文章 0 订阅

A. Left-handers, Right-handers and Ambidexters
l个左撇子,r个右撇子,a个左右手都灵活的人,最多可以组成多少个人的队伍,队伍中用用左手和右手的人数需要相同
分类讨论一下就好了

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define CLR(a) memset(a,0,sizeof(a))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define FOR(i,a,b)  for(int i=(a);i<(b);i++)
#define REP(i,a,b)  for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1000000009;
const int N=30+10;

int main(){
    int a,b,c;
    cin>>a>>b>>c;
    if (a+c<=b){
        cout<<(a+c)*2<<endl;
    }
    else if (b+c<=a){
        cout<<(b+c)*2<<endl;
    }
    else cout<<(a+b+c)/2*2<<endl;
    //cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";
    return 0;
}

B. Intercepted Message
双指针,维护两个数列的前缀和,如果a的前缀和大于b的前缀和,说明当前a指针的位置有可能是一个划分点,所以移动b指针,反之亦然

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define CLR(a) memset(a,0,sizeof(a))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define FOR(i,a,b)  for(int i=(a);i<(b);i++)
#define REP(i,a,b)  for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1000000009;
const int N=1e5+10;

int n,m,p1,p2,a[N],b[N];
ll sum1,sum2;
int ans;

int main(){
    cin>>n>>m;
    FOR(i,0,n) cin>>a[i];
    FOR(i,0,m) cin>>b[i];
    sum1=a[0];
    sum2=b[0];
    while(1){
        while(sum1<sum2) {
            sum1+=a[++p1];
        }
        while(sum2<sum1){
            sum2+=b[++p2];
        }
        if (sum1==sum2){
            ans++;
            if (p1==n-1&&p2==m-1) break;
            sum1=a[++p1];
            sum2=b[++p2];
        }
    }
    cout<<ans<<endl;
    //cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";
    return 0;
}

C. Zebras
维护两类序列,一类序列结尾为0,一类序列结尾为1,由于这两种序列可以相互转换,所以我们用一个分界点来分割这两类序列,[1,a]代表序列结尾为1,[a+1,sum]代表序列结尾为0,接下来分类讨论,a不断摆动就好了。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define CLR(a) memset(a,0,sizeof(a))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define FOR(i,a,b)  for(int i=(a);i<(b);i++)
#define REP(i,a,b)  for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1000000009;
const int N=2e5+10;

int k,a,num,sum;
char ch;
vector<int> ans[N];

int main(){
    while(cin>>ch){
        k++;
        num=ch-'0';
        if (num==0){
            if (a==0){
                sum++;
                ans[sum].pb(k);
            }
            else if (a>0) {
                ans[a].pb(k);
                a--;
            }
        }
        else if (num==1){
            if (a==sum){
                cout<<"-1"<<endl;
                return 0;
            }
            else if (a<sum) {
                a++;
                ans[a].pb(k);
            }
        }
    }

    if (a>0) {
        cout<<"-1"<<endl;
        return 0;
    }
    cout<<sum<<endl;
    REP(i,1,sum){
        cout<<ans[i].size();
        FOR(j,0,ans[i].size()){
            cout<<' '<<ans[i][j];
        }
        cout<<endl;
    }
    //cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";
    return 0;
}

D. A Leapfrog in the Array
好气啊这题,想了好久,还是太菜了。。
应该这样子想的,首先有两种思考方向,一种是从头推过去,一种是从终点局面慢慢退回去,考虑每个格子中的数是从哪里来的,只要想到这个问题,这道题应该就会做了。。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define CLR(a) memset(a,0,sizeof(a))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define FOR(i,a,b)  for(int i=(a);i<(b);i++)
#define REP(i,a,b)  for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+9;
const int N=30+10;

ll n,q,x;

ll solve(ll x){
    if (x%2==1) return x/2+1; 
    else return solve(n+x/2);
}

int main(){
    cin>>n>>q;
    while(q--){
        cin>>x;
        cout<<solve(x)<<endl;
    }

    //cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值