//目录

Hao Yin Jian 寒假第一周

题目链接:https://vjudge.net/contest/147561#problem/A

题意:除法运算,abcde / fghij = n,从小到大输出,其中abcdefghij为0~9的不重复数字。

分析:

1、从小到大其实就是一大就跟着大。

2、不用枚举0~9的全排列,只用枚举其中一个数fghij即可,算出abcde,看是不是0~9都有。

Tip: sprintf(*,格式输入,*);用法,把目标数据转成char * 型。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     //freopen("in.txt","r",stdin);
 8     int n;
 9     int kase = 0;
10     while(scanf("%d",&n),n)
11     {
12         if(kase++)
13             puts("");
14         int cnt = 0;
15         char buf[99];
16         for(int fghij=1234;; fghij++)
17         {
18             int abcde = fghij*n;
19             sprintf(buf,"%05d%05d",abcde,fghij);
20             if(strlen(buf)>10) break;
21             sort(buf,buf+10);
22 
23             bool flag = true;
24             for(int i=0; i<10; i++)
25                 if(buf[i]!=i+'0')
26                 {
27                     flag = false;
28                     break;
29                 }
30 
31             if(flag)
32             {
33                 cnt ++;
34                 printf("%05d / %05d = %d\n",abcde,fghij,n);
35             }
36 
37         }
38 
39         if(cnt==0)
40             printf("There are no solutions for %d.\n",n);
41     }
42     return 0;
43 }
View Code

 

题目链接:https://vjudge.net/contest/147561#problem/B

题意:最大乘法,要你找出一个连续子序列乘积最大。

分析:打算枚举起点,终点,求和,肯定是TLE,利用前缀和的思想修改一下,变成前缀积。

 1 #include <bits/stdc++.h>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 int x[20];
 7 
 8 int main()
 9 {
10     int n;
11     int cases = 1;
12     while(scanf("%d",&n)!=EOF)
13     {
14         for(int i=0; i<n; i++)
15             scanf("%d",&x[i]);
16 
17         long long ans = 0;
18         for(int i=0; i<n; i++) {
19             long long tmp = 1;
20             for(int j=i; j<n; j++)
21             {
22                 tmp = tmp*(long long)x[j];
23                 ans = max(ans,tmp);
24             }
25         }
26         printf("Case #%d: The maximum product is %lld.\n\n",cases++,ans);
27 
28     }
29     return 0;
30 }
View Code

 

题目链接:https://vjudge.net/contest/147561#problem/C

题意:分数拆分。(x>=y) 找出所有 x,y,使得 1/k = 1/x + 1/y;

分析:由于是两个数的和,起点很容易知道,就是从 k 开始,但是不能够一直枚举下去,总要有一个结束点,这个结束点就是 2k,1/x + 1/y <= 2/y; 就有 y<=2k;

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7 
 8     int k;
 9     while(scanf("%d",&k)!=EOF) {
10         vector<int> ansx,ansy;
11         int cnt = 0;
12         for(int y=k+1;y<=2*k;y++) {
13             if((y*k)%(y-k)==0)
14             {
15                 cnt ++;
16                 int x = y*k/(y-k);
17                 ansx.push_back(x);
18                 ansy.push_back(y);
19                 //printf("1/%d = 1/%d + 1/%d\n",k,x,y);
20             }
21         }
22         printf("%d\n",cnt);
23         for(int i=0;i<cnt;i++)
24             printf("1/%d = 1/%d + 1/%d\n",k,ansx[i],ansy[i]);
25     }
26     return 0;
27 }
View Code

 

题目链接:https://vjudge.net/contest/147561#problem/D

题意:素数环。

分析:http://www.cnblogs.com/TreeDream/p/5712621.html

枚举每一个位置,这个时候就要回溯了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int prime[50]= {0}; ///是素数就是0
 5 bool vis[50];
 6 int ans[25];
 7 int n;
 8 
 9 void dfs(int k)
10 {
11     if(k==n+1)
12     {
13         for(int i = 1; i <=n; i++)
14         {
15             if(i!= 1) printf(" ");
16             printf("%d", ans[i]);
17         }
18         printf("\n");
19         return ;
20     }
21     else if(k==n)
22     {
23         for(int i=1; i<=n; i++)
24         {
25             if(!vis[i]&&!prime[ans[k-1]+i]&&!prime[i+ans[1]])
26             {
27                 ans[k] = i;
28                 vis[i]=true;
29                 dfs(k+1);
30                 vis[i] = false;
31             }
32         }
33     }
34     else
35     {
36         for(int i=1; i<=n; i++)
37         {
38             if(!vis[i]&&!prime[ans[k-1]+i])
39             {
40                 ans[k] = i;
41                 vis[i]=true;
42                 dfs(k+1);
43                 vis[i] = false;
44             }
45         }
46     }
47 }
48 
49 int main()
50 {
51     //freopen("in.txt","r",stdin);
52     int kase = 0;
53     ///打出40个素数来
54     for(int i=2; i<8; i++)
55         if(!prime[i])
56             for(int j=i*i; j<50; j+=i)
57                 prime[j] = 1;
58 
59     int Case = 1;
60     while(scanf("%d",&n)!=EOF)
61     {
62         if(kase>0) printf("\n");
63         memset(vis,false,sizeof(vis));
64         memset(ans,0,sizeof(ans));
65         printf("Case %d:\n",Case++);
66         ans[1] = 1;
67         vis[1] = true;
68         dfs(2);
69         kase++;
70     }
71 
72     return 0;
73 }
View Code

 

题目链接:https://vjudge.net/contest/147561#problem/E

题意:困难的串,有相邻的重复子串的就不是困难的串。输入n ,l,l 为可供你多少个字符选择,找出困难串里面的字典序第 n 的串。

分析:

枚举当前位置的字符,但是你要查是否有连续子串,然后状态转移到下一个位置,至于字典序的问题,只要每次从A开始就行了,当有了n 个,就输出。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int n,l;
 6 int cnt;
 7 int s[100];
 8 
 9 int dfs(int cur)
10 {
11     if(cnt++==n)
12     {
13         for(int i=0; i<cur; i++)
14         {
15             if(i%64==0&&i>0) puts("");
16             else if(i%4==0&&i>0) printf(" ");
17             printf("%c",'A'+s[i]);
18         }
19         printf("\n%d\n",cur);
20         return 0;
21     }
22 
23     for(int i=0; i<l; i++)
24     {
25         s[cur] = i;
26         int ok = 1;
27         for(int j=1; j*2<=cur+1; j++)
28         {
29             int equal =  1;
30             for(int k=0; k<j; k++)
31             {
32                 if(s[cur-k]!=s[cur-k-j])
33                 {
34                     equal = 0;
35                     break;
36                 }
37             }
38             if(equal) {
39                 ok = 0;
40                 break;
41             }
42         }
43         if(ok) if(!dfs(cur+1)) return 0;
44     }
45     return 1;
46 }
47 
48 int main()
49 {
50     while(scanf("%d%d",&n,&l),n)
51     {
52         cnt = 0;
53         dfs(0);
54     }
55 
56     return 0;
57 }
View Code

 

posted @ 2017-01-16 12:54  小草的大树梦  阅读(246)  评论(0编辑  收藏  举报