题目链接:https://codeforces.com/contest/1855
A. Dalton the Teacher
题意:n个人,n个座位,通过几次交换可以让所有人坐在不属于自己的编号上。
思路:统计坐在自己座位上的人cnt,交换次数为cnt/2,若为奇数需+1。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 200100;
int q[N];
int main()
{
int t;
cin >> t;
while(t --)
{
int n, cnt = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
{
int x;
cin >> x;
if(x == i)
cnt ++;
}
if(cnt % 2)
cout << cnt / 2 + 1 << endl;
else
cout << cnt / 2 << endl;
}
return 0;
}
B. Longest Divisors Interval
题意:给出一个数n(1<n<1e18),找出n的最长连续因数的长度。
思路:直接跑暴力从1开始找因数,出现非因数跳出即可。
连续2个数字里边必定有能整除2的,连续3个数字里边必定有能整除3的,…
连续n个数字里边必定有能整除n的,所以只需要从1开始判断直到不能被整除为止
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200100;
LL q[N];
int main()
{
int t;
cin >> t;
while(t --)
{
LL n;
cin >> n;
int tt = 0;
for(int i = 1; i <= n; i ++)
{
if(n % i == 0)
{
q[tt ++] = i;
}
else
break;
}
cout << tt << endl;
}
return 0;
}
C1. Dual (Easy Version)
题意:给出一组随机排列的数,通过将第i个数添加到第j个数来使整个序列非递减,询问操作数(无需最优),操作数要<=50,输出操作数以及操作方式。
思路:
- 找出给出序列的最大值与最小值,记录其以及其位置;
- 通过最大最小值的绝对值来判断:
- 若最大值大于最小值,则正序操作序列,a[i] < a[i - 1],则a[i]累加最大值
- 反之,倒序操作序列,a[i] > a[i + 1],则a[i] 累加最小值
- 若最大值的绝对值大于最小值的绝对值,则最大值必为正,反之最小值必为负
- 在累加操作中若出现操作后比最大值大或最小值小的数,更新最值并记录更新数位置,否则将会超过50次操作次数限制。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 100;
int a[N];
int main()
{
int t;
cin >> t;
while(t --)
{
PII q[N];
int n, ma = -100, mi = 100, maa, mii;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
if(a[i] >= ma)
{
ma = a[i];
maa = i;
}
if(a[i] <= mi)
{
mi = a[i];
mii = i;
}
}
//cout << ma << " " << mi << endl;
int k = 0;
if(abs(ma) > abs(mi))
{
for(int i = 2; i <= n; i ++)
{
while(a[i] < a[i - 1])
{
a[i] += ma;
q[k].first = i, q[k].second = maa;
k ++;
}
if(a[i] > ma)
{
ma = a[i];
maa = i;
}
}
}
else
{
for(int i = n - 1; i > 0; i --)
{
while(a[i] > a[i + 1])
{
a[i] += mi;
q[k].first = i, q[k].second = mii;
k ++;
}
if(a[i] < mi)
{
mi = a[i];
mii = i;
}
}
}
cout << k << endl;
for(int i = 0; i < k; i ++)
cout << q[i].first << " " << q[i].second << endl;
}
return 0;
}