Problem F Free Weights

Posted accepting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Problem F Free Weights相关的知识,希望对你有一定的参考价值。

二分答案。

思路:对于二分给定的mid,即当前允许移动的最大重量,我们可以把小于改重量的标记一下,然后把没有标记的按照顺序放到另一个数组,然后判断是否满足两两相同。

#include<bits/stdc++.h>
using namespace std;
const int N=1E6+7;
int arr[N];
int brr[N];
int crr[N];
bool mark[N],mark1[N];
const int INF=1e9+7;
const int mm=1e9;
int n;

bool judge(int x) 
    memset(mark,0,sizeof(mark));
    memset(mark1,0,sizeof(mark1));
    
    for(int i=1;i<=n;i++) 
        if(arr[i]<=x) mark[i]=1;
        if(brr[i]<=x) mark1[i]=1;
    
    
    
    int pos=0;
    for(int i=1;i<=n;i++)
        if(mark[i]==0) crr[++pos]=arr[i]; 
    
    
    
    if(pos&1) return 0;
    for(int i=1;i<=pos;i+=2)
        if(crr[i]!=crr[i+1]) return 0;
    
    pos=0;
    for(int i=1;i<=n;i++)
        if(mark1[i]==0) crr[++pos]=brr[i];
    
    if(pos&1) return 0;
    for(int i=1;i<=pos;i+=2) 
        if(crr[i]!=crr[i+1]) return 0;
    
    return 1;


void solve()
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
    for(int j=1;j<=n;j++) scanf("%d",&brr[j]);
    int l=0,r=mm;
    int ans=INF;
    while(l<=r)
        int mid=(l+r)/2;
        if(judge(mid))
            r=mid-1;
            ans=min(ans,mid);
        
        else l=mid+1;
    
    
    cout<<ans<<endl;


int main()
    solve();
    return 0;

 

以上是关于Problem F Free Weights的主要内容,如果未能解决你的问题,请参考以下文章

GYM 101173 F.Free Figurines(贪心||并查集)

UVA - 10118 Free Candies

STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM

STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM

STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM

Scalaz(33)- Free :算式-Monadic Programming