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();
}
}