Codeforces Round 786
A - Number Transformation
题目
题意
给定两个数x与y,问是否存在a,b使得x与a个b相乘等于y
思路
因为存在多组解,只需其中一组解即可,所以可以使a为1,若y能被x整除,则b=y/x,若不能,则输出0 0
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int t;
cin >> t;
while (t--) {
ll x, y;
cin >> x >> y;
ll a = 0, b = 0;
if (y % x == 0) {
a = 1;
b = y / x;
}
cout << a << " " << b << endl;
}
return 0;
}
B - Dictionary
题目
题意
《伯兰词典》中的单词按照字典中通常的顺序排序的。形式上,如果下列条件之一成立,则单词A在字典中出现的时间早于单词B:
1.A的第一个字母小于B的第一个字母
2.A和B的第一个字母相同,A的第二个字母小于B的第二个字母
给定一个单词S,在字典中找到它的位置
注意字典中不存在两个字母都相同的单词
思路
因为数据量不大,可以直接暴力求解
双层循环计数,若与S相同,则跳出循环
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--){
string s;cin>>s;
int ans=0, flag=0;
for(char i='a';i<='z';i++)
{
for(char j='a';j<='z';j++)
{
if(i==j) continue;//两个字母相等
ans++;
if(i==s[0]&&j==s[1])
{
cout<<ans<<endl;
flag=1;
break;
}
}
if(flag==1) break;
}
}
return 0;
}
C - Infinite Replacement
题目
题意
初始给定一个全由a组成的字符串s,再给定一个字符串t,t可替换s中任意a的位置,可替换数次,当s中不存在a时,则无法进行替换,问替换后会有多少个不同的字符串。
注意:也可以不进行替换
思路
分为两种情况:
1.若t中存在a并且t的长度不为1,则可以一直进行替换,有无穷个字符串,若t中存在a并且t的长度为1,则无论如何替换,s依旧是原来的字符,所以只有一种情况
2.若t中不存在a,则可以获取字符串s的长度l,情况为2的l次方。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;cin>>t;
while(t--)
{
string s;cin>>s;
string s2;cin>>s2;
int flag=0;
for(int i=0;i<s2.size();i++)
{
if(s2[i]=='a') {
flag=1;
break;
}
}
if(flag==1) {
if(s2.size()==1) cout<<1<<endl;
else cout << -1 << endl;
}
else {
ll l=s.size();
ll count=1;
count=pow(2,l);
cout<<count<<endl;
}
}
}
D - A-B-C Sort
题目
题意
有三个数组a,b和c,最初a总有n个元素,数组b和c为空,可执行以下算法:
1.a不为空,取a中最后一个元素移动到数组b的中间位置,若b中元素为奇数,则可以将此元素放在中间元素的左侧或者右侧,直到a变成空并且b中有n个元素
2.b不为空,从b取出中间元素放在c的末尾,如果b的长度为偶数,则可以任意选择两个中间元素中的随意一个,直到b变成空并且c中有n个元素
是否可以使c中做到是增序排序
思路
找规律会发现,如果n为奇数,则可以直接将a中的第一个元素放入c中,然后将a中剩余元素两个一起比大小,小的先放入c中,再将大的放入c中,然后再判断c是否为增序排序
如果n为偶数,就直接将a中第一个元素开始每两个元素一起比大小放入c中
数组b只是一个媒介,数组a的最后一个元素放入b中间,然后再取b的中间元素放入c中,其实到最后会发现a的开始元素会在b的中间,所以c的第一个元素会与a的第一个元素挂钩
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int a[n], c[n], k = 0;
for (int i = 0; i < n; i++)
cin >> a[i];
int flag = 0;
if (n % 2 == 1) {
c[k] = a[0];
flag = 1;
k++;
}
int i = 0;
if (flag == 1) i = 1;
for (; i < n; i += 2) {
if (a[i] > a[i + 1])
swap(a[i], a[i + 1]);
c[k] = a[i];
k++;
c[k] = a[i + 1];
k++;
}
int f = 0;
for (i = 1; i < n; i++) {
if (a[i] < a[i - 1])
f = 1;
}
if (f == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}