SMU Summer 2024 Contest Round 2

Sierpinski carpet

据题知,此题应该用递归的方法输出谢尔宾斯基地毯图形

AC代码:

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

int arr[1003][1003];

void digui(int x,int y,int jishu){
    if(jishu==0){
         arr[x][y]=1;
         return ;
    }
    int t = jishu/3;
    digui(x,y,t);
    digui(x+t,y,t);
    digui(x+t+t,y,t);
    digui(x,y+t,t);
    digui(x,y+t+t,t);
    digui(x+t,y+t+t,t);
    digui(x+t+t,y+t,t);
    digui(x+t+t,y+t+t,t);
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    int t = pow(3,n);
    digui(1,1,t);
    for(int i=1;i<=t;i++){
        for(int j=1;j<=t;j++){
            if(arr[i][j]==1) cout<<"#";
            else cout<<".";
        }cout<<endl;
    }
    return 0;
}

Consecutive

题意为找寻指定位置字符串中满足Sp == Sp+1 这一情况的数目,暴力写法会TLE,所以要采用前缀和优化,答案即为给出两位置对应前缀和之差

AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000006];
int main(){
    int n,q;
    cin>>n>>q;
    string s="?",s1;
    cin>>s1;
    s += s1;
    for(int i=1;i<s.size();i++){
        if(s[i]==s[i+1]){
            a[i+1]=1;
        }
    }
    for(int i=1;i<s.size();i++){
        a[i] += a[i-1];
    }
    while(q--){
        int l,b,cnt=0;
        cin>>l>>b;
        cout<<a[b]-a[l]<<endl;
    }
    return 0;
}

Minimum Width

本题的题意为,在限定的行数下,行宽最小为多少能装下给出的句子,第二行输入为句子中每个词的长度,若两词要放在同一行,则必须加一个空格

此题可用二分法来做,最长词的长度为left, 所有词语放在一行的情况为right

通过一个判断函数(judge(mid))来变换左右端点(sum = -1的情况可以正好抵消掉行首词语也加上的空格)(sum确认加上单词后还能放在一行中再把单词加入到sum中去)

AC代码:

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

int n,m;
long long l,r;
int arr[200005];

bool judge(long long mid){
    long long c = 0, sum = -1;
    for(int i=1;i<=n;i++){
        if((sum + arr[i] + 1) > mid){
            sum = -1;
            c++;
        }
        sum += arr[i]+1;
    }
    return c >= m;
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
        l = max(l,(long long)arr[i]);
        r += arr[i];
    }
    r += n-1;
    while(l<r){
        long long mid = (l+r)>>1;
        if(judge(mid)) l = mid + 1;
        else r = mid;
    }
    cout<<l;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值