Codeforces Round 924 (Div. 2)(A~B)

A. Rectangle Cutting

给你一个长方形x*y,其中x*y 和 y*x认为是一样的,问你对这个长方形进行对半切然后进行拼接,是否能得到一个不一样的长方形p*q。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define fr first
#define se second
#define endl '\n'
using namespace std;

int a,b;

bool same(pair<int,int>x,pair<int,int>y){
    if(x.fr==y.fr and x.se==y.se)return true;
    if(x.fr==y.se and x.se==y.fr)return true;
    return false;
}

void yes(){
    cout<<"Yes"<<endl;
}

void no(){
    cout<<"No"<<endl;
}

void solve(){
    cin>>a>>b;
    if(a%2==0 and !same({a,b},{a/2,b*2}))return yes();//能对半分就拼到另一边去
    if(b%2==0 and !same({a,b},{a*2,b/2}))return yes();
    return no();
}

void init(){

}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--)solve(),init();
    return 0;
}

B. Equalize

给你一个序列A,比如样例的:7 1 4 1,你可以给其加上序列长度的排列,比如:1 2 3 4 或者 1 3 2 4,问你加上排列之后最多会有几个数相等,比如:7+1 1+2 4+3 1+4 -> 8 3 7 5,只有一个相等,要找出一个最佳的排列,即小的数加大的,大的数加小的。

因为排列里面的数不会相等,所以原序列里面相等的数没有用,需要去重。

因为大的数加小的,小的数加大的,所以对去重后的序列排序(这里可以直接用set)

经过观察后发现,1 4 7,最多可以用的数是4,从每一个数开始去找边界,1 1+4,能把4框进来,7进不来,然后再从4开始,4 4+4,能把8框起来,所以最多2个,显然就是类似一个滑动窗口的东西,也可以说是双指针。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=2e5+5;

int n,ans=1,tmp;

vector<int>a;
set<int>s;

void solve(){
    cin>>n;
    per(i,1,n)cin>>tmp,s.insert(tmp);
    for(auto i:s)a.push_back(i);

    int j=0;
    per(i,0,a.size()-1){
        while(j<a.size()-1 and a[j+1]-a[i]<n)j++;
        if(j-i+1>ans)ans=j-i+1;
    }

    cout<<ans<<endl;
}

void init(){
    ans=1;
    a.clear();
    s.clear();
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--)solve(),init();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值