- 阳子墨 的博客
国庆集训 DAY-5
- @ 2024-10-7 17:30:39
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彩彩玩扫雷
暂无