题意:求出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;
}