1. 杭电ACM1030,如何做,哪个大虾来说一下思路
2. 杭电2048的解题思路是什么?我不太看的懂题目的意思!
递推题
N张票的所有排列可能自然是Ann = N!种排列方式
现在的问题就是N张票的错排方式有几种。
首先我们考虑,如果前面N-1个人拿的都不是自己的票,即前N-1个人满足错排,现在又来了一个人,他手里拿的是自己的票。
只要他把自己的票与其他N-1个人中的任意一个交换,就可以满足N个人的错排。这时有N-1种方法。
另外,我们考虑,如果前N-1个人不满足错排,而第N个人把自己的票与其中一个人交换后恰好满足错排。
这种情况发生在原先N-1人中,N-2个人满足错排,有且仅有一个人拿的是自己的票,而第N个人恰好与他做了交换,这时候就满足了错排。
因为前N-1个人中,每个人都有机会拿着自己的票。所以有N-1种交换的可能。
综上所述:f(n) = (i - 1) * [f(n - 1) + f(n - 2)]
递推公式出来了代码就没必要要了吧。。。
3. 请问杭电的1006题什么意思,并且怎么做啊
就是计算一下一天中秒针,分针,时针同时大于你输入的那个角度的概率!
解题的主要思路就是,时针,分针,秒针走的角度关于时间是周期函数,他们的差,即两个针之间的夹角也是关于时间的周期函数,而且是龋齿状的。给定一个hdans就可以求得一个周期内,夹角大于hdans的上下界,根据周期性,就可以求得整个定义域内的解,求得三个解范围之后,求解的交集就可以解决这个问题了!
4. 学了一学期的c语言 这个学期开始用杭电acm 原来做题目全是自己编的代码 现在的题目感觉很难 像一
自己可以去翻翻书,你举的例子就是高精,书上一般都会给你一些思路。
如果能想出来尽量自己想。
5. 杭电ACM2044 递推题的详细解答思路
//观察一下那张图就得到了递推式
假设从i走到j,那么当j-i<=1时肯定只有1种方法,否则就dp[i][j]=dp[i][j-1]+dp[i][j-2];比如说从1走到5的方法数,如果我们已经知道了从1走到3和从1走到4的方法数,二者加起来不就是从1走到5的方法数,因为3和4都能1步到达5
#include
#include
__int64 dp[51][51];
int main()
{
int i,j;
for(i=0;i<50;i++) dp[i][i]=1;
for (i=1;i<50;i++)
{
dp[i][i+1]=1;
for (j=i+2;j<50;j++)
{
dp[i][j]=dp[i][j-1]+dp[i][j-2];
}
}
int n;
scanf("%d",&n);
while(n--){
int a,b;
scanf("%d%d",&a,&b);
printf("%I64d\n",dp[a][b]);
}
}
6. 杭电ACM 1163题老是超时啊。求大牛优化。http://acm.hdu.edu.cn/showproblem.php?pid=1163
#include
#include
#include
typedef __int64 lld;
const int BIT=1000000000;
const int MAXLEN=4500;
struct BigNum
{
int dig[MAXLEN];
int len;
void clr()
{
memset(dig,0,sizeof(dig));
len=1;
}
}ZERO;
BigNum multi(BigNum a,BigNum b)
{
BigNum c=ZERO;
int i,k,j;
lld t;
c.len=a.len+b.len;
if(c.len>MAXLEN)return c;
for(i=0;i<a.len;i++)
for(j=0;j<b.len;j++)
{
t=(lld)a.dig[i]*(lld)b.dig[j];
if(t>=BIT)
{
c.dig[i+j]+=t%BIT;
c.dig[i+j+1]+=t/BIT;
}
else
{
c.dig[i+j]+=t;
}
k=i+j;
while(c.dig[k]>=BIT)
{
c.dig[k+1]+=c.dig[k]/BIT;
c.dig[k]%=BIT;
k++;
}
}
if(c.dig[c.len-1]==0)c.len--;
return c;
}
int digsum(int n)
{
int ret=0;
while(n>0)
{
ret+=n%10;
n/=10;
}
return ret;
}
int main()
{
//我是先写这个高精度代码,看出规律的,有循环,高精度代码要超时.可能是我的高精度不够好吧,有nlogn的乘法的,我不会.要用博利叶变换
int n,sum=0,x,i,j;
BigNum tmp,ans;
ZERO.clr();
int zz[18]={1 ,4 ,9 ,4 ,2 ,9 ,7 ,1 ,9 ,1 ,5 ,9 ,4 ,7 ,9 ,7 ,8 ,9};
while(scanf("%d",&n)!=EOF&&n>0)
//for(j=1;j<50;j++)
{
printf("%d\n",zz[(n-1)%18]);
continue;
n=j;
//printf("%d:",n);
tmp=ZERO;
tmp.dig[0]=n;
ans=ZERO;
ans.dig[0]++;
while(n)
{
if(n&1)ans=multi(ans,tmp);
tmp=multi(tmp,tmp);
n>>=1;
}
sum=0;
for(i=0;i<ans.len;i++)sum+=digsum(ans.dig[i]);
while(sum>9)
{
x=0;
while(sum>0)
{
x+=sum%10;
sum/=10;
}
sum=x;
}
printf("%d ",sum);
}
return 0;
}
/*
1 4 9 4 2 9 7 1 9 1 5 9 4 7 9 7 8 9
1 4 9 4 2 9 7 1 9 1 5 9 4 7 9 7 8 9
1 4 9 4 2 9 8 7 9 1 5 9 7 请按任意键继续. . .
*/
7. 我在看杭电ACM1029的问题时,很多人提到了map,这是什么呀,一种算法思路吗?
这个的算法是, 记录一个临时的变量和一个计数器
如果计数器变0了就把下一个读取的数据存进临时的变量
如果计数器不是0, 而读取的新数和临时变量相同, 则增加计数器
如果不同, 则减小计数器
到最后满足条件的数必定和临时变量相符合
8. AC水题,杭电ACM2048,帮忙解释下这道题思路是怎样的?
这个要应用到错排公式,你可以查一下这方面的资料