2024 蓝桥杯模拟赛 1 (div1) 题解

A.

把字符串小写转换成大写即可

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

void solve(){
    string s;cin>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]>='a'&&s[i]<='z'){
            s[i]=(char)(s[i]-'a'+'A');
        }
    }
    cout<<s;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

B.

用了substr()函数去找

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

string s="chuanzhi";
void solve(){
    string t;cin>>t;
    int ans=0;
    for(int i=0;i<t.size();i++){
        if(t[i]==s[0]&&i+7<t.size()){
            if(t.substr(i,8)==s)ans++;
        }
    }
    cout<<ans;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

C.

先判断给定的数字对于三种情况是否合法
但纯模没有全过,后来看题解
题解是直接暴力所有的合法日期,看是否出现这三个数字
确实妙

int main(){
	scanf("%d/%d/%d",&a,&b,&c);
	for(int i=19600101;i<=20591231;i++){//枚举日期的可取范围
		int y=i/10000,m=(i%10000)/100,d=i%100;//把日期分割年月日
		if(check(y,m,d)){//检查是否合法,然后判断是否满足题目条件
			if(y%100==a&&m==b&&d==c||
			   y%100==c&&m==a&&d==b||
			   y%100==c&&m==b&&d==a){
			   	printf("%d-%02d-%02d\n",y,m,d);
			   }
		}
	}
	return 0;
}

D.

先二分找到满足条件的一个值key
再从key一个个往上加,直到不满足条件得到最大值
从key一个个往下减,直到不满足条件得到最小值

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

#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
void solve(){
    int n;cin>>n;
    vector<pair<int,int>>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;
    int l=1,r=1000000000,mid;
    int mi=inf,ma=-inf;
    int key;
    while(l<=r){
        mid=(l+r)/2;
        bool mii=0,maa=0;
        for(int i=1;i<=n;i++){
                if (a[i].first / mid == a[i].second)continue;
                else if(a[i].first / mid > a[i].second){
                    maa=1;
                    break;
                }else if(a[i].first / mid < a[i].second){
                    mii=1;
                    break;
                }

        }
        if(mii==0&&maa==0){
            key=mid;
            break;
        }else if(mii){
            r=mid-1;
        }else if(maa){
            l=mid+1;
        }
    }
    int tmp=key;
    //cout<<"key="<<key<<'\n';
    while(1){
        tmp++;
        bool f=0;
        for(int i=1;i<=n;i++){
            if (a[i].first / tmp == a[i].second)continue;
            else {
                f=1;break;
            }
        }
        if(f){
            ma=tmp-1;
            break;
        }
    }
    tmp=key;
    while(1){
        tmp--;
        bool f=0;
        for(int i=1;i<=n;i++){
            if (a[i].first / tmp == a[i].second)continue;
            else {
                f=1;break;
            }
        }
        if(f){
            mi=tmp+1;
            break;
        }
    }
    cout<<mi<<' '<<ma;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

E.

算术,模拟

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

void solve(){
    int n;cin>>n;
    int ans=n;
    while(1){
        ans+=n/3;
        int yu=n%3;
        yu+=n/3;
        n=yu;
        if(n<3)break;
    }
    cout<<ans;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

F.

二分

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

void solve(){
    int n,k;cin>>n>>k;
    vector<pair<int,int>>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;
    int l=1,r=100000,mid;
    int ans=1;
    while(l<=r){
        mid=(l+r)/2;
        int cnt=0;
        for(int i=1;i<=n;i++){
            int h=a[i].first,w=a[i].second;
            cnt+=(h/mid)*(w/mid);
        }
        if(cnt>=k){
            l=mid+1;
            ans=max(ans,mid);
        }else r=mid-1;
    }
    cout<<ans;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

G.

遍历,把瓶子放到该放的位置上即可

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

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(a[i]==i)continue;
        else{
            ans++;
            int pos;
            for(int j=1;j<=n;j++){
                if(a[j]==i){
                    pos=j;
                    break;
                }
            }
            a[pos]=a[i];
            a[i]=i;
        }
    }
    cout<<ans;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

H.

树状dp

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

#define int long long
const int N=1e5+10;
int n;
int a[N];
vector<int>g[N];
int ans;
int dfs(int u,int fa){
    int sum=a[u];
    for(int i=0;i<g[u].size();i++){
        int y=g[u][i];
        if(y==fa)continue;
        sum+=max(0ll,dfs(y,u));
    }
    ans=max(ans,sum);
    return sum;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    cout<<ans;
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

I.

串长-最长回文子串就是答案
最长回文子串=原串和颠倒串的最长公共子序列

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

int dp[1010][1010];

void solve(){
    string s;cin>>s;
    int sz=s.size();
    s=" "+s;
    string t=" ";
    for(int i=s.size()-1;i>=1;i--){
        t.push_back(s[i]);
    }
    for(int i=1;i<s.size();i++){
        for(int j=1;j<t.size();j++){
            if(s[i]==t[j])dp[i][j]=dp[i-1][j-1]+1;
            else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }
    cout<<(sz-dp[sz][sz]);
}

signed main(){
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
}
posted @ 2024-01-22 19:23  WW爆米花  阅读(36)  评论(0编辑  收藏  举报