复盘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训练的主要内容,如果未能解决你的问题,请参考以下文章
复盘8.17训练:UCF Local Programming Contest Final Round