首页 > 其他 > 详细

小晴天系列—暴力

时间:2015-04-28 22:42:26      阅读:414      评论:0      收藏:0      [点我收藏+]

A:题目大意:给出一个n,在1~n这n个数里面任选三个数,求它们的最小公倍数。找到这个最大的ans。

思路:如果n是奇数的话,那么n,n-1,n-2必然互质,所以ans=n*(n-1)*(n-2)

        如果n是偶数的话,而且n也是3的倍数的话,那么最大的最小公倍数肯定是(n-1)*(n-2)*(n-3)

                                而且n不是3的倍数的话,那么最大的最小公倍数肯定是n*(n-1)*(n-3)。

代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     long long sum,n;
 7     while (cin>>n){
 8     if(n==1)
 9     {
10         printf("1\n");
11         continue;
12     }else if(n==2)
13     {
14         printf("2\n");
15         continue;
16     }
17     else if(n%2!=0)
18     {
19         sum=n*(n-1)*(n-2);
20     }else
21     {
22         if(n%3==0)
23         {
24             sum=(n-3)*(n-1)*(n-2);
25         }else
26         {
27             sum=n*(n-1)*(n-3);
28         }
29     }
30     printf("%lld\n",sum);}
31     return 0;
32 }

B题以后补上,因为还没有ac= =

C:题目大意:一个三位数乘以一个两位数,得到一个四位数+一个三位数,加完之后得到一个五位数。

输入五行,以字符串输入。例如:

***
**
3384
846
*****  
求打*的位置有几种填法。暴力枚举两个乘数。然后对每一个得到的结果进行判断是否符合题意。代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 char s[5][5];
 7 
 8 int ok1(int i)
 9 {
10     int a,b,c,d;
11     a=i/100;b=(i%100)/10;c=(i%10);
12     if(s[0][0]!=*&&s[0][0]-0!=a) return 0;
13     if(s[0][1]!=*&&s[0][1]-0!=b) return 0;
14     if(s[0][2]!=*&&s[0][2]-0!=c) return 0;
15     return 1;
16 }
17 int ok2(int j)
18 {
19     int a,b;
20     a=j/10;b=j%10;
21     if(s[1][0]!=*&&s[1][0]-0!=a) return 0;
22     if(s[1][1]!=*&&s[1][1]-0!=b) return 0;
23     return 1;
24 }
25 int ok3(int m)
26 {
27     int a,b,c,d;
28     a=m/1000;b=(m%1000)/100;c=(m%100)/10;d=(m%10);
29     if(s[2][0]!=*&&s[2][0]-0!=a) return 0;
30     if(s[2][1]!=*&&s[2][1]-0!=b) return 0;
31     if(s[2][2]!=*&&s[2][2]-0!=c) return 0;
32     if(s[2][3]!=*&&s[2][3]-0!=d) return 0;
33     return 1;
34 }
35 int ok4(int n)
36 {
37     int a,b,c;
38     a=n/100;b=(n%100)/10;c=(n%10);
39     if(s[3][0]!=*&&s[3][0]-0!=a) return 0;
40     if(s[3][1]!=*&&s[3][1]-0!=b) return 0;
41     if(s[3][2]!=*&&s[3][2]-0!=c) return 0;
42     return 1;
43 }
44 int ok5(int sum)
45 {
46     int a,b,c,d,e;
47     a=sum/10000;b=(sum%10000)/1000;c=(sum%1000)/100;d=(sum%100)/10;e=sum%10;
48     if(s[4][0]!=*&&s[4][0]-0!=a) return 0;
49     if(s[4][1]!=*&&s[4][1]-0!=b) return 0;
50     if(s[4][2]!=*&&s[4][2]-0!=c) return 0;
51     if(s[4][3]!=*&&s[4][3]-0!=d) return 0;
52     if(s[4][4]!=*&&s[4][4]-0!=e) return 0;
53     return 1;
54 }
55 int main()
56 {
57     int t;
58     scanf ("%d",&t);
59     while (t--)
60     {
61         int i,j,k,sum=0;
62         for(i=0;i<5;i++)
63             scanf ("%s",s[i]);
64         for(i=100;i<=999;i++)
65         {
66             for(j=10;j<=99;j++)
67             {
68                 int m=i*(j%10);
69                 int n=i*(j/10);
70                 if(ok1(i)&&ok2(j)&&m>=1000&&m<10000&&n>=100&&n<1000)
71                 {
72                     if(ok3(m)&&ok4(n)&&(m+n*10)>=10000&&ok5(m+n*10))
73                         sum++;
74                 }
75             }
76         }
77         printf("%d\n",sum);
78     }
79     return 0;
80 }
D题:还有木有解决的问题。以后更新。
E题:给一个数列,给一个k。最大元素大于K的连续子序列的个数。

虽然是暴力专题,可是还是用dp来解的。dp[i]表示,包含第i个数之前的所有数中的子序列的个数。
那么如果a[i]>k,dp[i]=i+1,否则dp[i]=dp[i-1]。
代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #define max(a,b) a>b?a:b
 4 int dp[200005],a[200005];
 5 int n,k;
 6 int main()
 7 {
 8     int t;
 9     scanf ("%d",&t);
10     while (t--)
11     {
12         scanf ("%d%d",&n,&k);
13         int i,j;
14         for(i=0;i<n;i++)
15         {
16             scanf ("%d",&a[i]);
17             if(a[i]>k)
18                 dp[i]=1;
19             else
20                 dp[i]=0;
21         }
22         for(i=1;i<n;i++)
23         {
24             if(a[i]>k)
25                 dp[i]=i+1;
26             else
27                 dp[i]=dp[i-1];
28         }
29         int sum=0;
30         for(i=0;i<n;i++)
31             sum+=dp[i];
32         printf("%d\n",sum);
33     }
34     return 0;
35 }

F题:题目大意:这里有m个苹果,把他们分别放在n个篮子里。有多少种放法。篮子可以允许放0个。但是,1 2 1 和1 1 2是一种情况。

这个问题属于m的n划分问题。可以用dp来做。

 dp[i][j]代表j的i划分的个数。  递推式:dp[i][i]=dp[i][j-i]+dp[i-1][j];

代码如下:

 1 #include <cstdio>
 2 int dp[100][100];
 3 int main()
 4 {
 5     int t;
 6     scanf ("%d",&t);
 7     while (t--)
 8     {
 9         int m,n,i,j,k;
10         scanf ("%d %d",&n,&m);
11         dp[0][0]=1;
12         for(i=1;i<=m;i++)
13         {
14             for(j=0;j<=n;j++)
15             {
16                 if(j-i>=0)
17                     dp[i][j]=dp[i-1][j]+dp[i][j-i];
18                 else
19                     dp[i][j]=dp[i-1][j];
20             }
21         }
22         printf("%d\n",dp[m][n]);
23     }
24     return 0;
25 }

G:题目大意:搜索整个图,找到图中最大的连通的点数。

dfs搜索整个图。dfs入门题目。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #define max(a,b) a>b?a:b
 4 using namespace std;
 5 
 6 int num[25][25];
 7 int n,m;
 8 int dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,1,-1,-1,1,-1};//搜索八个方向。
 9 int sum;
10 int ok(int x,int y)
11 {
12     if(x>=0&&x<n&&y<m&&y>=0)
13         return 1;
14     return 0;
15 }
16 void dfs(int x,int y)
17 {
18     if(num[x][y])
19         sum++;
20     num[x][y]=0;
21     for(int i=0;i<8;i++)
22     {
23         int xx=x+dir[i][0];
24         int yy=y+dir[i][1];
25         if(ok(xx,yy)&&num[xx][yy])
26             dfs(xx,yy);
27     }
28 }
29 int main()
30 {
31     int t;
32     scanf ("%d",&t);
33     while (t--)
34     {
35         scanf("%d %d",&n,&m);
36         int i,j,k;
37         for(i=0;i<n;i++)
38             for(j=0;j<m;j++)
39                 scanf ("%d",&num[i][j]);
40         int maxx=0;
41         for(i=0;i<n;i++)
42             for(j=0;j<m;j++)
43                 if(num[i][j])
44                 {
45                     sum=0;
46                     dfs(i,j);
47                     maxx=max(maxx,sum);
48                 }
49         printf("%d\n",maxx);
50     }
51     return 0;
52 }

好了。。还有两题没有ac,等题解发了再更新。

其实还是有很多题目不会做。。还需要很努力很努力

小晴天系列—暴力

原文:http://www.cnblogs.com/bei-insomia/p/4462794.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!