- 吴易繁 的博客
国庆模拟赛DAY05
- @ 2024-10-6 16:18:29
A. 切数字乘法
暴力枚举。
我们可以枚举分割点,用两个变量来记录分割点左右两个数的值,然后将这两个变量存起来,最后找最大值即可。
注意:
- 若长度只为,那么就直接输出。
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
string s;
cin>>s;
if(s.size()==1) cout<<s;
else{
long long ans=0;
for(int i=0;i<s.size()-1;i++){
long long a=0,b=0;
for(int j=0;j<=i;j++) a=a*10+(s[j]-'0');
for(int j=i+1;j<s.size();j++) b=b*10+(s[j]-'0');
ans=max(ans,a*b);
}
cout<<ans;
}
return 0;
}
B. 合并班级
排序。
对于这道题目我们将进行以下步骤:
- 输入,这两个结构体数组。
- 将,这两个结构体数组进行排序。
- 将,这两个数组里的元素添加一个排名序号。
- 将,这两个数组里的元素全部存到另一个结构体数组里。
- 将结构体数组进行排序。
- 将结构体数组进行元素添加一个排名序号。
- 与之前的排名对比求和。
- 最后输出答案即可。
注意:
- 要开 !(我就是因为没开 所以只拿了分)
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct P{
int cj,pm;
};
P a[100010],b[100010],z[200010];
bool cmp(P a,P b){
return a.cj>b.cj;
}
signed main(){
freopen("class.in","r",stdin);
freopen("class.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i].cj;
for(int i=1;i<=m;i++) cin>>b[i].cj;
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+m,cmp);
int cnt=0,ans=0;
for(int i=1;i<=n;i++){
if(a[i-1].cj!=a[i].cj) a[i].pm=(cnt+=ans+1),ans=0;
else a[i].pm=cnt,ans++;
}
cnt=0,ans=0;
for(int i=1;i<=m;i++){
if(b[i-1].cj!=b[i].cj) b[i].pm=(cnt+=ans+1),ans=0;
else b[i].pm=cnt,ans++;
}
ans=0;
int j=1,k=1;
for(int i=1;i<=n+m;i++){
if(j<=n&&k<=m){
if(a[j].cj>=b[k].cj) z[i].cj=a[j].cj,z[i].pm=a[j].pm,j++;
else z[i].cj=b[k].cj,z[i].pm=b[k].pm,k++;
}
else if(j<=n) z[i].cj=a[j].cj,z[i].pm=a[j].pm,j++;
else if(k<=m) z[i].cj=b[k].cj,z[i].pm=b[k].pm,k++;
}
cnt=0;
int sum=0;
for(int i=1;i<=n+m;i++){
if(z[i-1].cj!=z[i].cj) cnt+=ans+1,ans=0;
else ans++;
sum+=(cnt-z[i].pm)*(cnt-z[i].pm);
}
cout<<sum;
return 0;
}
C. 彩彩玩跳棋
线性。
这题是真想不到呀。
#include<bits/stdc++.h>
using namespace std;
int a[200010],st[200010],b[200010],dp[200010];
int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
st[a[i]]=1;
}
for(int i=1;i<=n;i++){
if(!st[i]) b[i]=b[i-1];
else b[i]=i;
}
int mx=0;
for(int i=1;i<=n;i++){
if(st[i]) continue;
int c=i-b[i];
if(b[i]-c<=b[b[i]-1]) continue;
dp[i]=dp[b[i]-c]+c*2;
mx=max(mx,dp[i]);
}
cout<<mx;
return 0;
}