第一题:
1 #include<iostream> 2 using namespace std; 3 string a,b; 4 int len1,len2,len; 5 string str; 6 int main() 7 { 8 cin>>a; 9 cin>>b; 10 len1 = a.length(); 11 len2 = b.length(); 12 if(len1>len2)//补齐两个代码的长度,不足的用'0'补齐 13 { 14 for(int i=1;i<=len1-len2;i++) 15 { 16 b = "0" + b; 17 } 18 }else{ 19 for(int i=1;i<=len2-len1;i++) 20 { 21 a = "0" + a; 22 } 23 } 24 int temp;//记录每个位数相加后数目的大小 25 int cf = 0;//记录每次进位 26 len = a.length();// 记录最终的长度 27 for(int i=len-1;i>=0;i--)//需要从后往前遍历 28 { 29 temp = a[i]-'0' +b[i]-'0'+cf; 30 cf = temp/10; 31 temp %=10; 32 str = char(temp+'0') +str; 33 } 34 if(cf !=0) str = char(cf+'0') +str;//最后如果还有进位,则需要再次相加 35 cout<<str<<endl; 36 }
第二题:
1 #include<iostream> 2 using namespace std; 3 string a,b,str; 4 int main() 5 { 6 cin>>a; 7 cin>>b; 8 int sign = 0; 9 if(a==b) 10 { 11 cout<<"0"<<endl; 12 return 0; 13 } 14 if((a < b && a.size()==b.size()) || (a.size()<b.size())) 15 { 16 sign = 1; 17 swap(a,b); 18 } 19 int len1 = a.length(); 20 int len2 = b.length(); 21 int tep = len1 - len2; 22 int cf = 0; 23 for(int i=len2-1;i>=0;i--) 24 { 25 if(a[i+tep]<b[i]+cf) 26 { 27 str = char(a[i+tep]-b[i]-cf+'0'+10) + str; 28 cf = 1; 29 }else{ 30 str = char(a[i+tep]-b[i]-cf+'0')+str; 31 cf = 0; 32 } 33 } 34 for(int i =tep-1;i>=0;i--) 35 { 36 if(a[i]-cf>='0') 37 { 38 str = char(a[i]-cf)+str; 39 cf = 0; 40 }else{ 41 str = char(a[i]-cf+10)+str; 42 cf = 1; 43 } 44 } 45 str.erase(0,str.find_first_not_of('0')); 46 if(sign == 1) cout<<"-"; 47 cout<<str<<endl; 48 }
第三题:如果第三题还是不会的话 看下面这份题解 应该就懂了
https://www.luogu.com.cn/problem/solution/P1714
第四题:思路:从左到右求最大上升序列,从右向左求最大下降序列,然后逐个枚举中间值,使出队人数最少
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int g[105],f[105],a[105],s[105]; 5 int main() 6 { 7 int n; 8 cin>>n; 9 for(int i=1;i<=n;i++) 10 { 11 cin>>a[i]; 12 f[i]=1; 13 g[i]=1; 14 }//输入并赋初值 15 for(int i=n-1;i>=1;i--) 16 { 17 for(int j=i+1;j<=n;j++) 18 { 19 if(a[i]>a[j]&&f[i]<=f[j]+1) 20 { 21 f[i]=f[j]+1; 22 } 23 } 24 }//从右往左,按左高右低顺序找出每一个位置右边有几个从高到低的数 (包括自己) 25 for(int i=2;i<=n;i++) 26 { 27 for(int j=1;j<i;j++) 28 { 29 if(a[i]>a[j]&&g[i]<=g[j]+1) 30 { 31 g[i]=g[j]+1; 32 } 33 } 34 }//从左往右,按左低右高顺序找出每一个位置左边有几个从低到高的数 (包括自己) 35 int maxx=0; 36 for(int i=1;i<=n;i++) 37 { 38 s[i]=f[i]+g[i]-1;//把每个数的左边从低到高的数和右边从高到低的数相加 39 //注意!!自己加了两次要-1 40 if(s[i]>maxx) 41 { 42 maxx=s[i]; 43 } 44 } 45 cout<<n-maxx;//是求出列的人数 46 }
第五题:数据结构问题
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=100000; 4 char a[maxn],b[maxn],c[maxn]; 5 void dfs(int l1,int r1,int l2,int r2) 6 { 7 if(l1>r1) 8 { 9 return; 10 } 11 printf("%c",b[r2]); 12 int p=l1; 13 while(a[p]!=b[r2])p++; 14 int ent = p-l1; 15 dfs(l1,p-1,l2,l2+ent-1); 16 dfs(p+1,r1,l2+ent,r2-1); 17 } 18 int main() 19 { 20 int n; 21 scanf("%s",a); 22 scanf("%s",b); 23 n=a.length(); 24 dfs(0,n-1,0,n-1); 25 }
第六题:
1 #include<bits/stdc++.h> 2 using namespace std; 3 il int read() 4 { 5 re int x=0,f=1;char c=getchar(); 6 while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} 7 while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); 8 return x*f; 9 } 10 struct Edge 11 { 12 int u,v,w; 13 }edge[200005]; 14 int fa[5005],n,m,ans,eu,ev,cnt; 15 bool cmp(Edge a,Edge b) 16 { 17 return a.w<b.w; 18 } 19 //快排的依据(按边权排序) 20 int find(int x) 21 { 22 while(x!=fa[x]) x=fa[x]=fa[fa[x]]; 23 return x; 24 } 25 //并查集循环实现模板,及路径压缩 26 void kruskal() 27 { 28 sort(edge,edge+m,cmp); 29 //将边的权值排序 30 for(re int i=0;i<m;i++) 31 { 32 eu=find(edge[i].u), ev=find(edge[i].v); 33 if(eu==ev) 34 { 35 continue; 36 } 37 //若出现两个点已经联通了,则说明这一条边不需要了 38 ans+=edge[i].w; 39 //将此边权计入答案 40 fa[ev]=eu; 41 //将eu、ev合并 42 if(++cnt==n-1) 43 { 44 break; 45 } 46 //循环结束条件,及边数为点数减一时 47 } 48 } 49 int main() 50 { 51 n=read(),m=read(); 52 for(int i=1;i<=n;i++) 53 { 54 fa[i]=i; 55 } 56 //初始化并查集 57 for(int i=0;i<m;i++) 58 { 59 edge[i].u=read(),edge[i].v=read(),edge[i].w=read(); 60 } 61 kruskal(); 62 printf("%d",ans); 63 return 0; 64 }
第七题: