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 }
题目链接: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 }
题目链接: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 }
题目链接: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 }
题目链接: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 }