Codeforces 626C 简单题

题意:求出2的倍数n个,3的倍数m个,但是每个数只能出现一次,也就是说,6的倍数只能出现一次,问最后出现的最大的数?

分析:这题很简单,关键就是怎么判断6的倍数只用了一次,我的思路是先找出全部把n和m各自都选上,求出6的倍数重叠的个数num,然后依次在n和m的尾端判断,放在n的尾端还是放在m的尾端需要的砖块数少,就放在哪个尾端,其中需要判断一下尾端这个数是否被使用过,如果使用过就看下一个。

贴这个题,主要是看到了大神的代码,好简单,学习一下。他的思路是二分找出最小的ans,

我的:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include <vector>
using namespace std;
typedef long long ll;
const int N=3000000+5;
bool vis[N];
int main()
{
   // freopen("f.txt","r",stdin);
    int n,m;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&m);
    int nn=n;
    int k=min(n*2,m*3);
    for(int i=1;i<=n;i++)vis[i<<1]=1;
    for(int i=1;i<=m;i++)vis[i*3]=1;
    int num=k/6;
    while(num--){
        if((n+1)*2>(m+1)*3){
            if(vis[(m+1)*3]){
                if((n+1)*2>(m+2)*3)m+=2,vis[m*3]=1;
                else n++,vis[n<<1]=1;
            }
            else m++,vis[m*3]=1;
        }
        else{
            if(vis[(n+1)<<1]){
                if((n+2)*2>(m+1)*3)m++,vis[m*3]=1;
                else n+=2,vis[n<<1]=1;
            }
            else n++,vis[n<<1]=1;
        }
    }
    cout<<max(n*2,m*3)<<endl;
    return 0;
}

大神的:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <numeric>
#include <functional>
#define MOD 1000000007
#define MAX 0x3f3f3f3f
#define MAX2 0x3f3f3f3f3f3f3f3fll
#define ERR 1e-10
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#pragma warning(disable:4996)
using namespace std;

typedef long long ll;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;

ll n, m;

int main()
{
	int i, j, k;
	cin>>n>>m;
	ll low=0, high=1e18, mid;
	while(low <= high)
	{
		mid=(low+high)/2;
		ll x=mid/2-mid/6, y=mid/3-mid/6;
		ll t1=max(0ll, n-x), t2=max(0ll, m-y);
		//cout<<mid<<' '<<x<<' '<<y<<' '<<t1<<' '<<t2<<' '<<low<<' '<<high<<endl;
		if(t1+t2 <= mid/6) high=mid-1;
		else low=mid+1;
	}
	cout<<low;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值