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\n",x,a[i]);boo=1;}
30     }
31     if (!boo) printf("No Solution\n");
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\n",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\n",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\n",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 }
应该还是可以理解的,比较快。

 

 
posted @ 2017-07-31 00:46  Kaiser-  阅读(427)  评论(0编辑  收藏  举报