A. 切数字乘法

暴力枚举。

我们可以枚举分割点,用两个变量来记录分割点左右两个数的值,然后将这两个变量存起来,最后找最大值即可。

注意:

  • 若长度只为11,那么就直接输出。
#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. 合并班级

排序。

对于这道题目我们将进行以下步骤:

  • 输入aabb这两个结构体数组。
  • aabb这两个结构体数组进行排序。
  • aabb这两个数组里的元素添加一个排名序号。
  • aabb这两个数组里的元素全部存到另一个结构体数组里。
  • 将结构体数组进行排序。
  • 将结构体数组进行元素添加一个排名序号。
  • 与之前的排名对比求和。
  • 最后输出答案即可。

注意:

  • 要开longlong longlong!(我就是因为没开longlong longlong所以只拿了4040分)
#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. 彩彩玩跳棋

线性dpdp

这题是真想不到呀。

#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;
}