第四次周赛参考代码

第一题:

 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 }

第七题:

猜你喜欢

转载自www.cnblogs.com/wangqiqq/p/12928588.html