博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hao Yin Jian 寒假第一周
阅读量:5136 次
发布时间:2019-06-13

本文共 4365 字,大约阅读时间需要 14 分钟。

题目链接:

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

分析:

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

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

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

1 #include 
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

 

题目链接:

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

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

1 #include 
2 #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
View Code

 

题目链接:

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

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

1 #include 
2 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
View Code

 

题目链接:

题意:素数环。

分析:

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

1 #include 
2 #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 }
View Code

 

题目链接:

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

分析:

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

1 #include 
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
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
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/6289226.html

你可能感兴趣的文章
js-格式化数字保留两位小数-带千分符
查看>>
【Java】forward & redirect 的差异
查看>>
Java学习笔记--字符串和文件IO
查看>>
【BZOJ1951】古代猪文(CRT,卢卡斯定理)
查看>>
poj 2823 线段树
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
Maximum Gap
查看>>
sublime3
查看>>
[转]快速矩阵快速幂
查看>>
CMap的使用(转)
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
《浪潮之巅》十八十九章笔记
查看>>
Power Strings
查看>>
[转载]Hash
查看>>
Nuget:Newtonsoft.Json
查看>>
你是这样理解shell编程的嘛?
查看>>
前端性能优化之重排和重绘
查看>>
Assets和Raw区别
查看>>