在一个无限大的平面上,有n条直线和m个交点,求平面被分成了多少块
(没有三条及以上的直线交于同一点)
找规律后可以发现,平面数=直线数+交点数+1,高精度计算
int lena=s1.length();
int lenb=s2.length();
for (int i=0;i<lena;++i) a[lena-i]=s1[i]-'0';
for (int i=0;i<lenb;++i) b[lenb-i]=s2[i]-'0';
a[1]++;
int len=lena+lenb;
for (int i=1;i<=len;++i){
ans[i]+=a[i]+b[i];
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
while (ans[len]==0&&len>1) len--;
for (int i=len;i>=1;--i) printf("%d",ans[i]);
一只蒲公英上有n个种子,保证每个种子都能发芽并成长成一样的蒲公英,求m年后,一只蒲公英变为了多少只
将答案分别mod 19941023和19950814输出
快速幂,输出n^m
while (b>0){
if (b%2==1) ans=(ans*a)%mod;
b/=2;
a=(a*a)%mod;
}
给定一些长短不一的n个小木棍,求所能围成的矩形的最大面积,否则输出无解
dfs+剪枝 or dp
dp做法:dp[i][j][k]表示到第i个木棍,矩形的水平的两条边之间相差j,竖直的两条边之间相差k, 此时矩形两边的长度分别为dp[i][j][k].x和dp[i][j][k].y
根据数据规模,所有木棍长度的一半最多为240,因此可行
for (int i=0;i<=n;i++)
for (int j=0;j<=120;j++)
for (int k=0;k<=120;k++)
dp[i][j][k].x=-10000, dp[i][j][k].y=10000;
dp[0][0][0].x=0; dp[0][0][0].y=0;//初始化
for (int i=1;i<=n;i++)
for (int j=0;j<=120;j++)
for (int k=0;k<=120;k++){
xint tmp;
dp[i][j][k]=dp[i-1][j][k];
if (j>=l[i]) tmp.x=dp[i-1][j-l[i]][k].x+l[i],tmp.y=dp[i-1][j-l[i]][k].y;
else tmp.x=dp[i-1][l[i]-j][k].x+j,tmp.y=dp[i-1][l[i]-j][k].y;
dp[i][j][k]=maxx(dp[i][j][k],tmp);
if (j+l[i]<=240) tmp.x=dp[i-1][j+l[i]][k].x,tmp.y=dp[i-1][j+l[i]][k].y;
dp[i][j][k]=maxx(dp[i][j][k],tmp);
if (k>=l[i]) tmp.x=dp[i-1][j][k-l[i]].x,tmp.y=dp[i-1][j][k-l[i]].y+l[i];
else tmp.x=dp[i-1][j][l[i]-k].x,tmp.y=dp[i-1][j][l[i]-k].y+k;
dp[i][j][k]=maxx(dp[i][j][k],tmp);
if (k+l[i]<=240) tmp.x=dp[i-1][j][k+l[i]].x,tmp.y=dp[i-1][j][k+l[i]].y;
dp[i][j][k]=maxx(dp[i][j][k],tmp);
}
if (dp[n][0][0].x*dp[n][0][0].y<=0) printf("No Solution");
else printf("%d",dp[n][0][0].x*dp[n][0][0].y);