zoukankan      html  css  js  c++  java
  • 8月15号的练习:HDU 1042&&HDU 1050&&HDU 1181&&HDU 3501&&HDU 2601

    N!  HDU 1042

    一道大数阶乘题目:

    知道方法还是好实现的。。。

    对于求大整数的阶乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律

    例如 :123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;(把他们分段来存储,就不会乘不了了)

    如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]%10^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]%10^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0];

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int a[16000];
     6 int main()
     7 {
     8     int n,t,p,i,j;
     9     while(scanf("%d",&n)!=EOF)
    10     {
    11         a[1]=1;t=1;p=0;
    12         for(i=1;i<=n;i++)
    13         {
    14             for(j=1;j<=t;j++)
    15             {
    16                     a[j]=a[j]*i+p;
    17                     p=0;
    18                 if(a[j]>99999)
    19                 {
    20                     p=a[j]/100000;
    21                     a[j]=a[j]%100000;
    22                     if(j==t)
    23                     {
    24                         a[j+1]=p;
    25                         t++;
    26                         p=0;
    27                         break;
    28                     }
    29                 }
    30             }
    31         }
    32         printf("%d",a[t]);
    33         for(i=t-1;i>0;i--)
    34             printf("%05d",a[i]);//注意要保存零
    35         printf("
    ");
    36     }
    37     return 0;
    38 }

    Moving Tables HDU 1050

    贪心加排序:看懂题意很好做。。。

    注意:输入的点不一定左边小于右边!

    走廊的存在看清楚!

    最简单的方法就是开个数组记录每一对房间需要占用的次数,取最大值就行了!

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 int main()
     7 {
     8     int a[205],t,n,a1,a2,max,i;
     9     scanf("%d",&t);
    10     while(t--)
    11     {
    12         scanf("%d",&n);
    13         memset(a,0,sizeof(a));
    14         while(n--)
    15         {
    16             scanf("%d%d",&a1,&a2);
    17             if(a1>a2)
    18                 swap(a1,a2);
    19             for(i=(a1+1)/2;i<=(a2+1)/2;i++)
    20                 a[i]++;
    21         }
    22         max=a[1];
    23         for(i=1;i<=200;i++)
    24             if(a[i]>max)
    25                 max=a[i];
    26         printf("%d
    ",max*10);
    27     }
    28     return 0;
    29 }

    变形课 HDU 1181

    这个题目水了一笔!直接用Dfs()。。。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<string.h>
     5 using namespace std;
     6 int d=0,vis[1005];
     7 char b1[1005],c1[1005],flag;
     8 void dfs(int x)
     9 {
    10     int i;
    11     if(c1[x]=='m')
    12     {
    13         flag=1;
    14         return ;
    15     }
    16     for(i=0;i<d;i++)
    17         if(c1[x]==b1[i]&&!vis[i])
    18         {
    19             vis[i]=1;
    20             dfs(i);
    21             vis[i]=0;
    22         }
    23 }
    24 int main()
    25 {
    26     int i,n;
    27     char a[1005];
    28     while(scanf("%s",a)!=EOF)
    29     {
    30         if(a[0]=='0')
    31         {
    32             flag=0;
    33             for(i=0;i<d;i++)
    34             {
    35                 if(b1[i]=='b')
    36                 {
    37                     memset(vis,0,sizeof(vis));
    38                     vis[i]=1;
    39                     dfs(i);
    40                     vis[i]=0;
    41                 }
    42                 if(flag)
    43                     break;
    44             }
    45             if(flag)
    46                 printf("Yes.
    ");
    47             else
    48                 printf("No.
    ");
    49             d=0;
    50         }
    51         else
    52         {
    53             n=strlen(a);
    54             b1[d]=a[0];
    55             c1[d]=a[n-1];
    56             d++;
    57         }
    58     }
    59 }

    Calculation 2 HDU 3501

    一道用欧拉函数求解的数学题:(表示很蛋疼)

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int mod=1000000007;
     5 int main()
     6 {
     7     __int64 ans,n,m,i;
     8     while(scanf("%I64d",&n)!=EOF)
     9     {
    10         if(n==0) 
    11             break;
    12         ans=m=n;
    13         for(i=2;i*i<=n;i++)
    14         {
    15             if(n%i==0)
    16             {
    17                 ans-=ans/i;
    18                 while(n%i==0) 
    19                     n/=i;
    20                 if(n==1) 
    21                     break;
    22             }
    23         }
    24         if(n!=1) 
    25             ans-=ans/n;   
    26         ans=(m*(m-1)/2-m*ans/2)%mod;
    27         printf("%I64d
    ",ans);
    28     }
    29  return 0;
    30 }

    摘自:http://blog.sina.com.cn/s/blog_79b832820100s1md.html

    An easy problem HDU 2601

    表示又是一道数学题:(看到关键点就好说)

    i*j+i+j==N可以变成(i+1)*(j+1)==N+1又因为(0<i<=j)取根号

     1 #include<stdio.h>
     2 #include<math.h>
     3 int main()
     4 {
     5     __int64 n;
     6     int d,s,i,t;
     7     scanf("%d",&t);
     8     while(t--)
     9     {
    10         scanf("%I64d",&n);
    11         n++;
    12         d=sqrt(n);
    13         s=0;
    14         for(i=2;i<=d;i++)
    15             if(n%i==0)
    16                 s++;
    17         printf("%d
    ",s);
    18     }
    19     return 0;
    20 }
  • 相关阅读:
    Java 开发问题
    include和request
    VC++6.0怎么显示行号
    快速排序
    如何解决虚拟机安装centos无法全屏显示问题!
    详解.NET 4.0新特性Dynamic相关知识
    Action C#
    windbg不常用命令2
    底层枚举 网络连接时的结构
    netbios 和smb
  • 原文地址:https://www.cnblogs.com/tt123/p/3265136.html
Copyright © 2011-2022 走看看