题目链接:
题意:除法运算,abcde / fghij = n,从小到大输出,其中abcdefghij为0~9的不重复数字。
分析:
1、从小到大其实就是一大就跟着大。
2、不用枚举0~9的全排列,只用枚举其中一个数fghij即可,算出abcde,看是不是0~9都有。
Tip: sprintf(*,格式输入,*);用法,把目标数据转成char * 型。
1 #include2 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 }
题目链接:
题意:最大乘法,要你找出一个连续子序列乘积最大。
分析:打算枚举起点,终点,求和,肯定是TLE,利用前缀和的思想修改一下,变成前缀积。
1 #include2 #include 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
题目链接:
题意:分数拆分。(x>=y) 找出所有 x,y,使得 1/k = 1/x + 1/y;
分析:由于是两个数的和,起点很容易知道,就是从 k 开始,但是不能够一直枚举下去,总要有一个结束点,这个结束点就是 2k,1/x + 1/y <= 2/y; 就有 y<=2k;
1 #include2 3 using namespace std; 4 5 int main() 6 { 7 8 int k; 9 while(scanf("%d",&k)!=EOF) {10 vector 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
题目链接:
题意:素数环。
分析:
枚举每一个位置,这个时候就要回溯了。
1 #include2 #include 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 else35 {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 }
题目链接:
题意:困难的串,有相邻的重复子串的就不是困难的串。输入n ,l,l 为可供你多少个字符选择,找出困难串里面的字典序第 n 的串。
分析:
枚举当前位置的字符,但是你要查是否有连续子串,然后状态转移到下一个位置,至于字典序的问题,只要每次从A开始就行了,当有了n 个,就输出。
1 #include2 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 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