竞赛链接:http://codeforces.com/contest/1141
A. Game 23
题目大意:
对于两个数n,m,求n通过乘2或者乘3变成m所需要的次数。无解输出-1.
例如120 51840需要7次变换。
解题思路:
如果m%n不等于0,则无解。
如果n>m,则无解。
那么n到达m需要乘的步长为p = m / n,这个如果这个p能被2 3全部整除,则说明有解,否则无解。
AC代码:
//
// Created by jal on 2019-05-21.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
if(n > m || m % n){
cout << -1 << endl;
return 0;
}
int p = m / n;
int cnt = 0;
while(p%2==0){
cnt++;
p/=2;
}
while(p%3==0){
cnt++;
p/=3;
}
if(p==1){
cout << cnt << endl;
}else{
cout << -1 << endl;
}
}
B. Maximal Continuous Rest
题目大意:
长度为n的01数组(至少包含一个0),这个数组序列会不断重复下去。求最长的连续1的个数。
解题思路:
考虑到数组的首尾元素都是1的话,最后的一个元素是与这个数组下一次的第一个元素拼接,所以索性将数组扩大为长度为2*n的,后一半的数组内容同前一半。然后求最长的1的个数即可。
AC代码:
//
// Created by jal on 2019-05-21.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<int>v(2*n);
for(int i = 0; i < n; i++){
cin >> v[i];
v[n+i] = v[i];
}
int cnt = 0;
int res = 0;
for(int i = 1; i < 2 * n; i++){
if(v[i] == 0){
cnt = 0;
}else{
if(v[i] == v[i-1]){
cnt++;
}else{
cnt=1;
}
}
res = max(res, cnt);
}
cout << res << endl;
}
C. Polycarp Restores Permutation
题目大意:
一个n的排列 p 1 , p 2 , . . . , p n p_{1},p_{2}, ..., p_{n} p1,p2,...,pn进行差分后得到 q 1 , q 2 , . . . , q n − 1 q_{1}, q_{2} ,... ,q_{n-1} q1,q2,...,qn−1,现在给出数字n和差分序列 q 1 , q 2 , . . . , q n − 1 q_{1}, q_{2} ,... ,q_{n-1} q1,q2,...,qn−1,求出原排列 p 1 , p 2 , . . . , p n p_{1},p_{2}, ..., p_{n} p1,p2,...,pn
解题思路:
- 第一种方法 O ( N