杭电ACM1030,如何做,哪个大虾来说一下思路

2024-05-05 06:13

1. 杭电ACM1030,如何做,哪个大虾来说一下思路


杭电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的上下界,根据周期性,就可以求得整个定义域内的解,求得三个解范围之后,求解的交集就可以解决这个问题了!

请问杭电的1006题什么意思,并且怎么做啊

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]);
  }
  }

杭电ACM2044 递推题的详细解答思路

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, 而读取的新数和临时变量相同, 则增加计数器
如果不同, 则减小计数器

到最后满足条件的数必定和临时变量相符合

我在看杭电ACM1029的问题时,很多人提到了map,这是什么呀,一种算法思路吗?

8. AC水题,杭电ACM2048,帮忙解释下这道题思路是怎样的?

这个要应用到错排公式,你可以查一下这方面的资料
最新文章
热门文章
推荐阅读