SMU Summer 2024 Contest Round 5

A Robot Takahashi 

思路:将小崽子和大人分到两个数组中排序,然后枚举每个体重大小,用lower_bound();求得正确数量不断用max();求出答案

AC代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 200005;

vector<int> a, c; 
int w[N]; char s[N];

int f(int x)
{
	int ax = a.end() - lower_bound(a.begin(), a.end(), x);
	int cx = lower_bound(c.begin(), c.end(), x) - c.begin();
	return ax + cx;
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n;
	cin >> n >> s;
	for(int i=0; i<n; i++)
	{
		cin >> w[i];
		if(s[i] == '0') c.push_back(w[i]);
		else a.push_back(w[i]);
	}
	sort(a.begin(), a.end());
	sort(c.begin(), c.end());
	
	int ans = 0;
	for(int i=0; i<n; i++)
	{
		int c = w[i];
		ans = max(ans,f(c));
		ans = max(ans,f(c+1));
	}
	cout << ans;
	return 0;
}

B Connect 6

题意:给出的图中是否有一个‘#’ 在 行 || 列 || 主对角线 || 辅对角线 至多再加两个‘#’ 使之有6个连续的‘#’    (简称下六子棋)

思路:直接暴力搜索就好

AC代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1003;

string s[N];
int n;

int main(){
    cin>>n;
    int ans = 0;
    for(int i=0;i<n;i++) cin>>s[i];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i+5<n){
                int cnt = 0;
                for(int k=i;k<=i+5;k++) cnt += s[k][j]=='.';
                ans |= cnt<=2;
            }
            if(j+5<n){
                int cnt = 0;
                for(int k=j;k<=j+5;k++) cnt += s[i][k]=='.';
                ans |= cnt<=2;
            }
            if(i+5<n && j+5<n){
                int cnt = 0;
                for(int k=0;k<6;k++) cnt += s[i+k][j+k]=='.';
                ans |= cnt<=2;
            }
            if(i-5>=0 && j+5<n){
                int cnt = 0;
                for(int k=0;k<6;k++) cnt += s[i-k][j+k]=='.';
                ans |= cnt<=2;
            }
        }
    }
    if(ans) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

C Strange Balls

题意:按顺序往洞里扔球,每个球有个数字i,有i个印着i球的球连一起的时候会消失,问最后剩几个球

思路:洞->栈,但每次要有球消失的时候进栈出栈会超时,所以改来维护栈顶相同球的数量,数量到了就pop();

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long

stack<pair<int,int> > S;

int n,cnt=0;
int arr[200005];

signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    for(int i=1;i<=n;i++){
        if(S.empty()){
            S.push( {arr[i],1} );
            cnt++;
        }
        else if(S.top().first == arr[i]){
            S.top().second++;
            cnt++;
            if(S.top().second == arr[i]){
                cnt -= arr[i];
                S.pop();
            }
        }
        else{
            S.push({arr[i],1});
            cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

D Linear Probing

题意:一个1到2^20的数组,每个数都是-1,两种操作,[1]输入一个数x,从第x位开始往后数到第一个是-1的位置,将这个数换成x,[2]输出第x位的数

思路:直接弄一定会超时/超栈,所以采用并查集,当一个数被改过之后,其父点改为后一个为-1的点的位置

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 1048576;
int arr[mod],ne[mod];

int find(int x){
    return ne[x]!=x?ne[x]=find(ne[x]):x;
}

signed main(){
    for(int i=0;i<mod;i++) ne[i]=i,arr[i]=-1;
    int q;
    cin>>q;
    while(q--){
        int op,x,id;
        cin>>op>>x;
        id = x%mod;
        if(op==1){
            id = find(id);
            arr[id] = x;
            ne[id]=find((id+1)%mod);
        }
        else{
            cout<<arr[id]<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值