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;
}