7-9 特立独行的幸福
题意:见PTA
思路:其实就是遍历进行查找,利用递归函数,为了解决是特立独行,还要用一个全局数组进行存储所有满足条件的数进行去重标记,最后在输出的时候进行判断是否是只读取过一次
注意:数组一定开的大于1e5,而且这个特立独行与这个数是不是自身的加和是某个数的平方无关
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 int n[100005]={0}; 8 int sum=0; 9 int nn[100005]={0}; 10 int maxx=0; 11 int judge(int num){ 12 if(num>maxx){ 13 maxx=num; 14 } 15 if(n[num]==1){ 16 return -1; 17 }else{ 18 sum++; 19 n[num]++; 20 nn[num]++; 21 if(num==1||num==10||num==100||num==1000||num==10000){ 22 return sum; 23 }else{ 24 if(num/10==0){ 25 return judge(num*num); 26 }else if(num/100==0){ 27 return judge((num/10)*(num/10)+(num%10)*(num%10)); 28 }else if(num/1000==0){ 29 return judge((num/100)*(num/100)+(num%10)*(num%10)+(num/10%10)*(num/10%10)); 30 }else{ 31 return judge((num/1000)*(num/1000)+((num%1000)/100)*((num%1000)/100)+((num%1000)%10)*((num%1000)%10)+((num%1000)/10%10)*((num%1000)/10%10)); 32 } 33 } 34 35 } 36 } 37 int s(int num){//判断素数 38 for(int i=2;i<=sqrt(num);i++){ 39 if(num%i==0){ 40 return 0; 41 } 42 } 43 return 1; 44 } 45 46 int main(){ 47 int a,bb; 48 scanf("%d %d",&a,&bb); 49 int flag=0; 50 int b[10010][2]={0}; 51 int js=0; 52 for(int i=a;i<=bb;i++){ 53 sum=0; 54 for(int j=0;j<=maxx;j++){ 55 n[j]=0; 56 } 57 int jj=judge(i); 58 if(jj!=-1){ 59 b[js][0]=i; 60 b[js][1]=jj; 61 js++; 62 } 63 } 64 for(int i=0;i<js;i++){ 65 if(nn[b[i][0]]==1){ 66 flag++; 67 if(s(b[i][0])==1){ 68 printf("%d %d\n",b[i][0],b[i][1]*2); 69 }else{ 70 printf("%d %d\n",b[i][0],b[i][1]); 71 } 72 } 73 } 74 if(flag==0){ 75 printf("SAD\n"); 76 } 77 78 }
7-12 功夫传人
题意:见PTA
思路:就是用结构体存入,将突变的进行存入进去
注意:1.一开始全部使用结构体存入之后结构体数组会溢出
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<queue> 9 using namespace std; 10 const int maxx=1e4+10; 11 typedef long long ll; 12 typedef unsigned long long ull; 13 struct A{ 14 int bf; 15 double gl; 16 }g[100010]; 17 struct B{ 18 int bh; 19 int gs; 20 int a[10000]; 21 }p[500]; 22 int main(){ 23 double n,m,t,z,r; 24 int x,y; 25 for(int i=0;i<100001;i++){ 26 g[i].bf=0; 27 g[i].gl=0; 28 } 29 cin>>n>>z>>r; 30 g[0].bf=1; 31 g[0].gl=z; 32 double ans=0; 33 r=(1-r/100); 34 int index=0; 35 for(int i=0;i<n;i++){ 36 cin>>x; 37 if(g[i].bf!=0){ 38 if(x==0){ 39 cin>>y; 40 ans+=(g[i].gl*y); 41 } 42 else{ 43 for(int j=0;j<x;j++){ 44 cin>>y; 45 g[y].bf=g[i].bf+1; 46 g[y].gl=g[i].gl*r; 47 } 48 } 49 } 50 else{ 51 p[index].bh=i; 52 p[index].gs=x; 53 if(x==0){ 54 cin>>p[index].a[0]; 55 } 56 else{ 57 for(int j=0;j<x;j++){ 58 cin>>p[index].a[j]; 59 } 60 } 61 index++; 62 } 63 } 64 for(int i=0;i<index;i++){ 65 if(p[i].gs==0){ 66 ans+=(g[p[i].bh].gl*p[i].a[0]); 67 } 68 else{ 69 for(int j=0;j<p[i].gs;j++){ 70 g[p[i].a[j]].bf=g[p[i].bh].bf+1; 71 g[p[i].a[j]].gl=g[p[i].bh].gl*r; 72 } 73 } 74 } 75 printf("%d",(int)ans); 76 return 0; 77 }
原文:https://www.cnblogs.com/bonel/p/13945870.html