T1切数字乘法

正确思路

枚举分割点,再将左右两边乘起来

正确代码

#include<bits/stdc++.h>
using namespace std;
long long a[100];
int main()
{
	freopen("num.in","r",stdin);
	freopen("num.out","w",stdout);
	long long n,n2,ws=0,maxx=-2e9;
	cin>>n;
	n2=n;
	while(n2)
	{
		ws++;
		a[ws]=n2%10;
		n2/=10;
	}
	for(int i=ws;i>1;i--)
	{
		long long a1=0,a2=0;
		for(int j=ws;j>=i;j--)
		{
			a1=a1*10+a[j];
		}
		for(int j=i-1;j>=1;j--)
		{
			a2=a2*10+a[j];
		}
		maxx=max(maxx,a1*a2);
	}
	cout<<maxx;
	return 0;
}

T2合并班级

错因:不开long long(见祖宗)(╬▔皿▔)╯

正确思路

排个序,将他们的排名得到.

再排个序,得到现在的排名.

在计算落差值

正确代码

#include<bits/stdc++.h>
using namespace std;
long long n,m,sum;
struct stued
{
	long long fs;
	long long cj;
};
stued a[100010],b[100010],z[200020];
bool cmp(stued c,stued d)
{
	return c.fs>d.fs;
}
long long cb()
{
	long long ans=0,i=1,j=1;
	for(long long t=1;t<=n+m;)
	{
		if((a[i].fs>=b[j].fs||j>m)&&i<=n)
		{
			z[t].fs=a[i].fs;
			if(z[t-1].fs==z[t].fs) z[t].cj=z[t-1].cj;
			else z[t].cj=t;
			ans+=(z[t].cj-a[i].cj)*(z[t].cj-a[i].cj);	
			i++;
			t++;
		}
		if((a[i].fs<=b[j].fs||i>n)&&j<=m)
		{
			z[t].fs=b[j].fs;
			if(z[t-1].fs==z[t].fs) z[t].cj=z[t-1].cj;
			else z[t].cj=t;
			ans+=(z[t].cj-b[j].cj)*(z[t].cj-b[j].cj);	
			j++;
			t++;
		}
	}
	return ans;
}
int main()
{
	freopen("class.in","r",stdin);
	freopen("class.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i].fs;
	for(int i=1;i<=m;i++) cin>>b[i].fs;
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+m+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(a[i].fs==a[i-1].fs) a[i].cj=a[i-1].cj;
		else a[i].cj=i;
	}
	for(int i=1;i<=m;i++)
	{
		if(b[i].fs==b[i-1].fs) b[i].cj=b[i-1].cj;
		else b[i].cj=i;
	}
	sum=cb();
	cout<<sum;
	return 0;
}

T3彩彩玩跳棋

正确思路 本题是一个"简单"的线性dp

状态表示:dp[i] 表示第i个格子最远能跳多远

j=离i最近的有棋子的格子

d=i和j之间的距离

状态计算:dp[i]=dp[j-d]+d*2

如果j-d<0或j到j-d中有棋子,dp[i]=0 正确代码

#include<bits/stdc++.h>
using namespace std;
int a[200010],b[200010],c[200010],dp[200010];
int main()
{
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	int n,m,x=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++) 
	{
		cin>>a[i];
		b[a[i]]=1; 
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]) c[i]=i;
		else c[i]=c[i-1];
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]) continue;
		int d=i-c[i];
		if(c[i]-d<=0) continue;
		if(c[i]-d<=c[c[i]-1]) continue;
		dp[i]=dp[c[i]-d]+d*2;
	}
	int maxx=0;
	for(int i=1;i<=n;i++) maxx=max(maxx,dp[i]);
	cout<<maxx;
	return 0;
}

T4彩彩玩扫雷

暂无