Codeforces Round #719 (Div. 3)
A. Do Not Be Distracted!
input
5
3
ABA
11
DDBBCCCBBEZ
7
FFGZZZY
1
Z
2
AB
output
NO
NO
YES
YES
YES
题意:
输入一串字符串,除去首次出现同样连续的字符,如果后面再次出现同样字符就输出NO,否则,输出"YES";
思路:
两层for循环遍历, 当s[i+1]!=s[i]&&s[j]==s[i]就说明,该字符除去第一次连续出现,后面再次出现。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
string s;
cin>>t;
while(t--)
{ int flag=0;
int n;
cin>>n;
cin>>s;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(s[i+1]!=s[i]&&s[j]==s[i])
flag=1;
}
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}return 0;
}
B. Ordinary Numbers
input
6
1
2
3
4
5
100
output
1
2
3
4
5
18
题意:
输入一个整数n,判断从1到n有多少个数是普通数?(普通数:该数字的所有组成数字只有一个,也就是所有组成数字相同)
思路:
因为只有该数字的所有组成数字全相同才满足条件,1,2,3,4,5,6,7,8,9,11,22,33,44,55…所以,k=i;k=10k+i;类似 i=10i+i;判断这个是否存在即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=9;i++)
{
long long k=i;
while(k<=n)
{
sum++;
k=k*10+i;
}
}cout<<sum<<endl;
}return 0;
}
C. Not Adjacent Matrix
input
3
1
2
3
output
1
-1
2 9 7
4 6 3
1 8 5
题意:
输入一个数n,输出一个n*n型的矩阵,该矩阵要满足,每个点与周围点的数值只差不能为1,且由1到n^2这些数字填充,如果该矩阵不存,输出-1。
思路:
分奇数偶数输出,先特判2,输出-1;后先把所有奇数输出,再把所有偶数输出。中间记住换行。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
if(n==2)
{
cout<<"-1"<<endl;
continue;
}
int k=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<k<<" ";
k=k+2;
if(k>n*n)
k=2;
}cout<<endl;
}
}return 0;
}
D. Same Differences
input
4
6
3 5 1 4 6 6
3
1 2 3
4
1 3 3 4
6
1 6 3 4 5 6
output
1
3
3
10
题意:
输入一串数组,判断该数组中有多少对数组满足
aj-ai=j-i (j>i)?
思路:
将等式转换,aj-ai=j-i变换为aj-j=ai-i; 利用map去存aj-j的数量。后求和输出
AC代码
//aj-ai=j-i
//aj-j=ai-i
#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,x;
cin>>n;
map<ll,ll>mp;
ll sum=0;
for(int i=1;i<=n;i++)
{
cin>>x;
sum+=mp[x-i];
mp[x-i]++;
}cout<<sum<<endl;
}return 0;
}
E. Arranging The Sheep
input
5
6
**.*..
5
*****
3
.*.
3
...
10
*.*...*.**
output
1
0
0
0
9
题意:
输入一串字符,"*“代表羊群,”."代表空地,先需要你判断至少需要移动多少个羊群才可以达到所有羊群相邻的效果。
思路:
贪心,先找出羊群的位置,只考虑如果是移动到同一个位置的话,直接每个数减去他们的中位数相加即可,现在是相邻,那我们只用给每个位置减去它们相对于中间的数的相对位移即可。记得开long long,会爆int
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn];
int main()
{
string s;
int t,n;
cin>>t;
while(t--)
{
cin>>n;
cin>>s;
int t=0;
for(int i=0;i<n;i++)
{
if(s[i]=='*')
a[t++]=i;
}
int mid=t/2;//中位数
long long sum=0;
for(int i=0;i<t;i++)
{
sum+=abs(a[i]-a[mid])-abs(i-mid);
//先求出每个数与中位数的差,后减去绝对偏移量
}cout<<sum<<endl;
}return 0;
}