Codeforces Round #651 (Div. 2) ABCD ----08工作室

A  Maximum GCD

直接输出n/2;不解释

B  GCD Compression

题意有点繁琐,其实想一想因为之选2*n-2个,又看到他一定能够造出来,其实能想到直接让他gcd是2,(!!!!其实就该秒的,一开始还没想出来)

#pragma G++ optimize(2)
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef  long long ll;//unsigned
typedef unsigned long long ull;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){  if(!b) return a;    return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; 	while(b) 	{		if(b&1) ans=(ans*a)%mod;		a=a*a%mod;		b>>=1;	}	return ans;}
/*  i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
ll n,m; 
ll a[2100];
ll b[2200];
ll c[2200];
int main()
{
	ll k,p,sum,maxl,minl=INF;
	ll t;
	cin>>t;
	while(t--)
	{
		read(n);
		ll cnt1=0,cnt2=0;
		rep(i,1,2*n)
		{
			read(a[i]);
			if(a[i]%2==1) b[++cnt1]=i;
			else c[++cnt2]=i;
		}
		ll sum=0;
		for(ll i=1;i<=cnt1;i+=2)
		{
			if(i<cnt1)
			{
				printf("%lld %lld\n",b[i],b[i+1]);
				sum++;
			}
			if(sum==n-1) break;
		}	
		for(ll i=1;i<=cnt2;i+=2)
		{
			if(i<cnt2)
			{
				printf("%lld %lld\n",c[i],c[i+1]);
				sum++;
			}
			if(sum==n-1) break;
		}	
	}
	
	return 0;
} 

 

Number Game

博弈类似,判断一下素数就行

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){  if(!b) return a;    return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; 	while(b) 	{		if(b&1) ans=(ans*a)%mod;		a=a*a%mod;		b>>=1;	}	return ans;}
/*  i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
 
int main()
{
    ll t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        if(n==1)
        {
        	puts("FastestFinger");
            continue;
        }
        if(n%2==1||n==2)
        {
            cout<<"Ashishgup"<<endl;
            continue;
        }
        ll cnt=0;
        while(n%2==0)
        {
            cnt++;
            n/=2;
        }
        if(n==1)
            puts("FastestFinger");
        else
        {
            if(cnt>1)
                cout<<"Ashishgup"<<endl;
            else
            {
                ll f=0;
                for(int i=2;i*i<=n;i++)
                {
                    if(n%i==0)
                        f=1;
                }
                if(f==0)
                    puts("FastestFinger");
                else
                    cout<<"Ashishgup"<<endl;
            }
        }
    }
    return 0;
}

 

D - Odd-Even Subsequence

 min(max(s1,s3,s5,…),max(s2,s4,s6,…))min(max(s1,s3,s5,…),max(s2,s4,s6,…)). 

就求一个这个。

大体怎么求呢,我们可以二分答案。(其实这个挺明显的)但是要考虑边界,比如四个数1 2 2 1,可以选1,1.因为1,1隔着两个,但是2,2就不行了,一开始偶数的这种情况一直没考虑,但奇数的时候却考虑了好多,然后就一直改奇数的,最后一想自己好蠢。

二分我们是二分k/2个数是否可以组成一个可行的偶数或奇数序列。

四个judge就粘贴复制。边界判断

#pragma G++ optimize(2)
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef  long long ll;//unsigned
typedef unsigned long long ull;
inline bool read(ll &num){char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;};
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,a,n) for(ll i=a;i>=n;i--)
#define mem(a,b) memset(a,b,sizeof(a))
const ll INF=5e18+7;const ll mod=1e18+7; const ll maxx=1e6+700;const double eps=1e-9;const double pi=acos(-1);
ll gcd(ll a,ll b){  if(!b) return a;    return gcd(b,a%b);};
ll qpow(ll a,ll b){ll ans=1; 	while(b) 	{		if(b&1) ans=(ans*a)%mod;		a=a*a%mod;		b>>=1;	}	return ans;}
/*  i am hengheng */
//ll head[maxx];ll deep[maxx];ll vis[maxx];ll dis[maxx];map<ll,ll>mp;
//ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};map<ll,ll>mp;//vector<ll>v[maxx];
ll n,m; 
ll a[maxx];
 
ll pipei[maxx];
 
ll judeg(ll k,ll geshu)
{
	ll cnt=0;
	rep(i,1,n)
	{
		if(a[i]<=k&&(pipei[cnt]!=i-1))
		{
			pipei[++cnt]=i;
		}
	}
	if(cnt>=geshu) return 1;
	return 0;
}
ll judeg2(ll k,ll geshu)
{
	ll cnt=0;
	rep(i,2,n-1)
	{
		if(a[i]<=k&&(pipei[cnt]!=i-1)) 
		{
			pipei[++cnt]=i;
		}
	}
	if(cnt>=geshu) return 1;
	return 0;
}
ll judeg3(ll k,ll geshu)
{
	ll cnt=0;
	rep(i,1,n-1)
	{
		if(a[i]<=k&&(pipei[cnt]!=i-1)) 
		{
			pipei[++cnt]=i;
		}
	}
	if(cnt>=geshu) return 1;
	return 0;
}
ll judeg4(ll k,ll geshu)
{
	ll cnt=0;
	rep(i,2,n)
	{
		if(a[i]<=k&&(pipei[cnt]!=i-1)) 
		{
			pipei[++cnt]=i;
		}
	}
	if(cnt>=geshu) return 1;
	return 0;
}
int main()
{
	pipei[0]=1000;
	ll k,p,sum,maxl=0,minl=INF;
	ll t;
	cin>>n>>k;
	rep(i,1,n) 
	{
		read(a[i]);
		minl=min(a[i],minl);
		maxl=max(a[i],maxl);
	}
	ll l,r;
	l=minl;r=maxl;
	ll ans1=INF,ans2=INF;
	if(k%2==0)
	{
		p=k/2;
		while(l<=r)
		{
			ll mid=(l+r)/2;
			if(judeg3(mid,p))
			{
				ans1=min(mid,ans1);
				r=mid-1;
			}
			else l=mid+1;
		}
		l=minl;r=maxl;
		while(l<=r)
		{
			ll mid=(l+r)/2;
			if(judeg4(mid,p))
			{
				ans2=min(mid,ans2);
				r=mid-1;
			}
			else l=mid+1;
		}
		cout<<min(ans1,ans2)<<endl;
	}
	else 
	{
		ans1=INF; ans2=INF;
		l=minl;r=maxl;
		p=k/2+1;
		while(l<=r)
		{
			ll mid=(l+r)/2;
			if(judeg(mid,p))
			{
				ans1=min(mid,ans1);
				r=mid-1;
			}
			else l=mid+1;
		}
		p--;
		l=minl;r=maxl;
		while(l<=r)
		{
			ll mid=(l+r)/2;
			if(judeg2(mid,p))
			{
				ans2=min(mid,ans2);
				r=mid-1;
			}
			else l=mid+1;
		}
		//printf("%lld  %lld\n",ans1,ans2);
		cout<<min(ans1,ans2)<<endl;
	}
	// ke buxianglin
	return 0;
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值