复盘7.12训练

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复盘7.12训练相关的知识,希望对你有一定的参考价值。

是真的快乐场。

A - Mean Inequality

在这里插入图片描述
在这里插入图片描述

Input
3
3
1 2 3 4 5 6
2
123 456 789 10
1
6 9
Output
3 1 4 2 5 6
123 10 456 789
9 6

题意:站成一个圈,左右两边的平均数不能等于中间的数。
思路:形成 高——低——高——低 这种形状的即可。也就是排序,前一半和后一半分开后插空。
如:1 2 3 4 5 6——1 4 2 5 3 6

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100];
int b[100];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;		
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		
		for(int i=1;i<=2*n;i++)
		{
			cin>>a[i];
		}
		sort(a+1,a+1+2*n);		
		int ii=1,jj=n+1;
		for(int i=1;i<=n;i++)
		{
			cout<<a[ii]<<" "<<a[jj]<<" ";
			ii++;jj++;
		}
		cout<<endl;
	}
	return 0;
}

B - Fair Division

在这里插入图片描述
在这里插入图片描述

Input
5
2
1 1
2
1 2
4
1 2 1 2
3
2 2 2
3
2 1 2
Output
YES
NO
YES
NO
NO

题意:有1g,2g的糖果。能否对半分。
无敌大水题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[105];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		memset(a,0,sizeof(a));
		int one=0,two=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i]==1) one++;
			else two++;
		}
		
		int sum=0;
		sum=2*two+one;
		if(sum%2==1) cout<<"NO";//加起来是奇数 
		else//加起来是偶数 
		{
			if(two%2==1)//two为奇数
			{
				if(one<2) cout<<"NO";
				else
				{
					one-=2;
					if(one%2==0) cout<<"YES";
					else cout<<"NO";
				}
			} 
			else
			{
				if(one%2==0) cout<<"YES";
				else cout<<"NO";
			}
		}		
		cout<<endl;
	}
	return 0;
}

C - Cancel the Trains

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

nput
3
1 2
1
3 4
3 2
1 3 4
2 4
9 14
2 7 16 28 33 57 59 86 99
3 9 14 19 25 26 28 35 41 59 85 87 99 100
Output
0
1
3

在这里插入图片描述
观察可得,有一样的数字就会撞,所以就要把其中一个去掉。
无敌大水题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[105],b[105];
int main()
{
	//n从下往上  m从左往右
	int t;cin>>t;
	while(t--)
	{
		int n,m;cin>>n>>m;
		memset(a,0,sizeof(a));		
		for(int i=1;i<=n;i++)
		{
			int temp;cin>>temp;
			a[temp]++;
		}
		for(int i=1;i<=m;i++)
		{
			int temp;cin>>temp;
			a[temp]++;
		}
		
		int sum=0;
		for(int i=1;i<=100;i++)
		{
			if(a[i]==2) sum++;
		}
		cout<<sum<<endl;
		
	}
	return 0;
}

D - Prison Break

在这里插入图片描述
在这里插入图片描述

Input
3
10 10 1 1
3 5 2 4
10 2 5 1
Output
18
4
6

画图观察可知,从最远的角落到出口就是所求。
无敌大水题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n,m,r,c;cin>>n>>m>>r>>c;
		int x1=1,y1=1,x2=1,y2=m,x3=n,y3=1,x4=n,y4=m;
		int ans=-1;
		int anss=abs(r-x1)+abs(c-y1);
		ans=max(ans,anss);
		anss=abs(r-x2)+abs(c-y2);
		ans=max(ans,anss);
		anss=abs(r-x3)+abs(c-y3);
		ans=max(ans,anss);
		anss=abs(r-x4)+abs(c-y4);
		ans=max(ans,anss);
		cout<<ans<<endl;
	}
	return 0;
}

E - AquaMoon and Two Arrays

在这里插入图片描述
在这里插入图片描述

4
4
1 2 3 4
3 1 2 4
2
1 3
2 1
1
0
0
5
4 3 2 1 0
0 1 2 3 4
Output
2
2 1
3 1
-1
0
6
1 4
1 4
1 5
1 5
2 5
2 5

在这里插入图片描述
题意:a b两数组,通过几次操作可以使a==b。每次操作:a中一个数字+1,另一个数字-1.
思路:要加的和要减的相同,则可以由a得到b。
无敌大水题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int a[N],b[N],c[N],d[N];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
		
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		for(int i=1;i<=n;i++)
		{
			cin>>b[i];
		}
		
		int jia=0,jian=0,sum=0,temp1=0,temp2=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]<b[i]) 
			{
				jian+=b[i]-a[i];
				int temp=b[i]-a[i];
				while(temp--)
				{
					c[temp1++]=i;
				}
			}
			else if(a[i]>b[i]) 
			{
				jia+=a[i]-b[i];
				int temp=a[i]-b[i];
				while(temp--)
				{
					d[temp2++]=i;
				}
			}
		}
		
		if(jia!=jian) {
			cout<<"-1"<<endl;
			continue;
		}
		
		else
		{
			cout<<jia<<endl;
			for(int i=0;i<jia;i++)
			{
				cout<<d[i]<<" "<<c[i]<<endl;
			}
		}
	}
	return 0;
}

F - AquaMoon and Stolen String

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入:

3
3 5
aaaaa
bbbbb
ccccc
aaaaa
bbbbb
3 4
aaaa
bbbb
cccc
aabb
bbaa
5 6
abcdef
uuuuuu
kekeke
ekekek
xyzklm
xbcklf
eueueu
ayzdem
ukukuk

输出:

ccccc
cccc
kekeke

题意:每一列之间会上下交换字母,被偷走的字符串不会参与交换。因此,只要把打乱顺序之前输入的字符串的每一列减去打乱顺序之后输入的字符串的每一列,得到的就是被偷走的字符串的该列字符。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
string a[N],b[N];
int c[N][26];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n,m;cin>>n>>m;
		memset(c,0,sizeof(c));
		for(int i=0;i<n;i++)
		{
			string t;cin>>t;
			a[i]=t;
		}
		for(int i=0;i<n-1;i++)
		{
			string t;cin>>t;
			b[i]=t;
		}
		for(int i=0;i<m;i++)//列 
		{
			for(int j=0;j<n;j++)//排 
			{
				c[i][a[j][i]-'a']++;
			}
		}
		for(int i=0;i<m;i++)//列 
		{
			for(int j=0;j<n-1;j++)//排 
			{
				c[i][b[j][i]-'a']--;
			}
		}
		
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<26;j++)
			{
				if(c[i][j])
				{
					cout<<(char)(j+'a');break;
				}
			}
		}
		cout<<endl;
	}
	return 0;
}

G - Air Conditioners

来源:原题

题意:可传温空调,该格子的温度是空调温度加上到空调的距离,求每格上的最低温度。
思路:先把空调温度填在格子上,再从左向右min一次,从右向左min一次即可。

之前傻傻的求什么空调作用范围,lay了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5,INF=0x3f3f3f3f;
int a[N],num[N];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n,m;cin>>n>>m;
		memset(a,0,sizeof(a));
		memset(num,INF,sizeof(num));
		
		for(int i=0;i<m;i++)
		{
			cin>>a[i];
		}
		for(int i=0;i<m;i++)
		{
			cin>>num[a[i]];
		}
		
		//从左往右min一次
		for(int i=1;i<=n;i++)
		{
			num[i]=min(num[i],num[i-1]+1);
		}
		
		//从右往左min一次
		for(int i=n;i>=1;i--)
		{
			num[i]=min(num[i+1]+1,num[i]);
		}
		
		for(int i=1;i<=n;i++)
		{
			cout<<num[i]<<" ";
		 } 
		 cout<<endl;
	}
	return 0;
}

以上是关于复盘7.12训练的主要内容,如果未能解决你的问题,请参考以下文章

编程初级训练营复盘

复盘7.8训练

复盘7.6训练

复盘8.17训练:UCF Local Programming Contest Final Round

复盘7.21训练:UCF Local Programming Contest Round 1A

听说多肉站案例不能采集了,那自行建设一个吧。爬虫120例复盘之战