zoukankan      html  css  js  c++  java
  • 1001 数组中和等于K的数对 1002 数塔取数问题 1003 阶乘后面0的数量 1004 n^n的末位数字 1009 数字1的数量

                    1001 数组中和等于K的数对
    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
    给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。
     
    Input
    第1行:用空格隔开的2个数,K N,N为A数组的长度。(2 <= N <= 50000,-10^9 <= K <= 10^9)
    第2 - N + 1行:A数组的N个元素。(-10^9 <= A[i] <= 10^9) 
    Output
    第1 - M行:每行2个数,要求较小的数在前面,并且这M个数对按照较小的数升序排列。
    如果不存在任何一组解则输出:No Solution。
    Input示例
    8 9
    -1
    6
    5
    3
    4
    2
    9
    0
    8
    Output示例
    -1 9
    0 8
    2 6
    3 5
    排序后线扫差不多吧,简单贪心。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<cstring>
     6 #include<map>
     7 using namespace std;
     8 
     9 const int NN=50007;
    10 
    11 int n,k;
    12 int a[NN];
    13 bool boo=0;
    14 map<int,int>p;
    15 
    16 int main()
    17 {
    18     scanf("%d%d",&k,&n);
    19     for (int i=1;i<=n;i++)
    20     {
    21         scanf("%d",&a[i]);
    22         p[a[i]]++;
    23     }
    24     sort(a+1,a+n+1);
    25     for (int i=n;i>=1;i--)
    26     {
    27         int x=k-a[i];
    28         if (x>=a[i]) break;
    29         if (p[x]) {printf("%d %d
    ",x,a[i]);boo=1;}
    30     }
    31     if (!boo) printf("No Solution
    ");
    32 } 
     
                    1002 数塔取数问题
    一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。
    每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。
     
       5
      8 4
     3 6 9
    7 2 9 5
     
    例子中的最优方案是:5 + 8 + 6 + 9 = 28
     
    Input
    第1行:N,N为数塔的高度。(2 <= N <= 500)
    第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数......第k+1行k个数。数与数之间用空格分隔(0 <= A[i] <= 10^5) 。
    Output
    输出最大值
    Input示例
    4
    5
    8 4
    3 6 9
    7 2 9 5
    Output示例
    28
    一道dp的水题吧。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 const int NN=507,INF=1e8+7;;
     9 
    10 int n;
    11 int f[NN][NN];
    12 
    13 int main()
    14 {
    15     scanf("%d",&n);
    16     for (int i=1;i<=n;i++)
    17         for (int j=1;j<=i;j++)
    18             scanf("%d",&f[i][j]);
    19     for (int i=1;i<=n;i++)
    20         for (int j=1;j<=i;j++)
    21             f[i][j]=max(f[i][j]+f[i-1][j-1],f[i][j]+f[i-1][j]);
    22     int ans=-INF;
    23     for (int i=1;i<=n;i++)
    24         ans=max(ans,f[n][i]);
    25     printf("%d
    ",ans);                    
    26 }
    1003 阶乘后面0的数量
    n的阶乘后面有多少个0?
    6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。
     
    Input
    一个数N(1 <= N <= 10^9)
    Output
    输出0的数量
    Input示例
    5
    Output示例
    1
    发现2一定比5多,所以只要找5的倍数即可除一除就好了。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<map>
     7 using namespace std;
     8 
     9 int n,ans=0;
    10 
    11 int main()
    12 {
    13     scanf("%d",&n);
    14     for (long long x=5;x<=n;x*=5)
    15         ans+=(n/x);
    16     printf("%d
    ",ans);
    17 }
    
    
    1004 n^n的末位数字
    给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字。
     
    Input
    一个数N(1 <= N <= 10^9)
    Output
    输出N^N的末位数字
    Input示例
    13
    Output示例
    3
    水题吧,最后一位乘一乘,取模即可。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 int n;
     9 bool boo[10]={0};
    10 int flag[10]={0};
    11 
    12 int main()
    13 {
    14     scanf("%d",&n);
    15     int y=n%10;
    16     int x=n%10,ci=0;
    17     while(1)
    18     {
    19         if (boo[x]) break;
    20         ci++,boo[x]=1,flag[x]=ci;
    21         x=x*y%10;
    22     }
    23     x=n%ci;
    24     if (x==0) x=ci;
    25     for (int i=0;i<=9;i++)
    26         if (flag[i]==x)
    27         {
    28             printf("%d
    ",i);
    29             break;
    30         }
    31 }
                      1009 数字1的数量
    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
     
    例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
    Input
    输入N(1 <= N <= 10^9)
    Output
    输出包含1的个数
    Input示例
    12
    Output示例
    5
    这道题可以计算每个位置出现1的次数,一个简单的数学归纳+计算,具体看代码。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 int n;
     9 
    10 int main()
    11 {
    12     scanf("%d",&n);
    13     int ans=0,tail=0,mi=1;
    14     while (n!=0)
    15     {
    16         int x=n%10;
    17         n/=10;
    18         ans+=n*mi;
    19         if (x==1) ans+=tail+1;
    20         if (x>1) ans+=mi;
    21         tail=tail+x*mi,mi*=10;
    22     }
    23     printf("%d",ans);
    24 }
    应该还是可以理解的,比较快。
     
  • 相关阅读:
    几款网络测试工具总结
    Linux安装telnet
    Linux下iptables 禁止端口和开放端口
    mysql创建某个数据库中的某张表 只读用户
    查看nginx版本号的几种方法
    Ngxtop-Nginx日志实时分析利器
    Nginx监控运维
    oracle经典书籍推荐
    华为典型局域网组网案例介绍(1)
    技术说明 路由器是如何工作的呢? 一个简单的解释
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7261120.html
Copyright © 2011-2022 走看看