A. Greatest Convex
题给你一个数k,问你在x<k的情况下满足[x!+(x-1)!]是k的倍数中x的最大值。
你随便带几个数算一下就会发现答案就是k-1。记得考虑特殊值1。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<limits>
#define ll long long
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int x;
cin >> x;
if (x == 1)
{
cout << "1\n";
continue;
}
else
{
cout << x - 1 << "\n";
}
}
}
B. Quick Sort
题意就是给你n个数,然后给出k,你每次可以任意移动这n个数中的k个,然后把这k个数排好序放到这个数组的末尾,问你需要使得整个数组升序排好需要操作的最小次数。
在这里举个例,2 1 3 4 5 6 7 8······,我们发现,无论后面是否完全排好,只要前面有没有完成升序的数,那么,后面哪怕已经排好,也需要移动。我们可以找到不需要移动的,然后用总数减去不需要移动的去除k向上取整就好了。
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<limits>
#define ll long long
using namespace std;
int a[200005];
signed main()
{
int t;
cin >> t;
while (t--)
{
int x, y, cn = 1, sum = 0;
cin >> x >> y;
for (int i = 1; i <= x; i++)
{
cin >> a[i];
if (a[i] == cn)
{
cn++;
}
else
{
sum++;
}
}
cout << ceil(1.0 * sum / y) << endl;
}
}
C. Elemental Decompress
题意:给你一个数组,输出两个数组,使得这两个数组相同位置上两数上的最大值符合
max(pi,qi)=ai。并且这两个数组是permutations类型的(无重复,无0,每个数从1自n必须出现一次)。
咱可以排除那些这个数组有数出现超过两次和数组中最大值不是n的,这一定无法满足条件,还有两个1,这是特殊情况,用map就OK。
首先咱记录只出现一次的数,使得这两个数组的这个位置都为这个数,这是一定满足条件,并且简单。
然后咱记录一下出现两个位置上的,就两个数组一边给一个。
对于上面俩数组已经出现的数,咱用俩bool数组去标记一下。
然后就是填充剩下的了,由于这个数组对称,我们可以通过对面那个数去获取,我一开始就是这样由对面那个数不断-1区寻找未被标记的,有就填上,并标记,没有就“NO”了,后来第11个测试TLE了,仔细想想,雀实不行。所以可以先用俩数组去分别对应获取那些还未出现过的数,然后sort,然后咱再去获取对应空位置对面的那个数,仍然sort,然后for循环两个两个数据去对比,小于就填上,否则就“NO”,怎么填上呢,咱可以多用俩数组去标记位置嘛。
记得及时清零和开加速哦。
代码附上:
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
#include<string>
#include<queue>
#include<set>
#include<vector>
#include<limits>
#define ll long long
using namespace std;
int a[200005], b[200005], c[200005],vb[200005],vc[200005],gb[200005],hc[200005];
bool d[200005], e[200005];
struct wao
{
int x;
int y;
}v[200005];
void shuchu(int n)
{
cout << "YES\n";
for (int i = 1; i <= n; i++)cout << v[i].x << " "; cout << "\n";
for (int i = 1; i <= n; i++)cout << v[i].y << " "; cout << "\n";
}
void bolk(int x)
{
for (int i = 1; i <= x; i++)
{
d[i] = false; e[i] = false;
}
}
void solve()
{
map<int, int >k; k.clear();
int n;
cin >> n;
bolk(n);
int yu = -1; bool pk = false;
for (int i = 1; i <= n; i++)
{
cin >> a[i]; k[a[i]]++;
if (k[a[i]] > 2 || k[1] == 2)
{
pk = true;
}
yu = max(yu, a[i]);
}
if (pk)
{
cout << "NO\n"; return;
}
if (yu < n)
{
cout << "NO\n"; return;
}
for (int i = 1; i <= n; i++)
{
if (k[a[i]] == 1)
{
v[i].x = a[i];
v[i].y = a[i];
d[a[i]] = true;
e[a[i]] = true;
}
}
int cnt = 1, cot = 1, vht = 1, vot = 1;
for (int i = 1; i <= n; i++)
{
hu = false;
if (k[a[i]] == 2)
{
int g = 1; bool po = false, pol = false;
v[i].x = a[i];
k[a[i]] = 99;
d[a[i]] = true;
b[v[i].x] = i;
hc[vht++] = a[i];
}
else
if (k[a[i]] == 99)
{
int g = 1; bool po = false, pol = false;
v[i].y = a[i];
e[a[i]] = true;
c[v[i].y] = i;
gb[vot++] = a[i];
}
}
for (int i = 1; i <= n; i++)
{
if (!d[i])vb[cnt++] = i;
if (!e[i])vc[cot++] = i;
}
sort(hc+1 , hc + vht );
sort(gb+1 , gb + vot );
sort(vb+1 , vb + cnt );
sort(vc+1, vc + cot );
for (int i = 1; i < cnt; i++)
{
if (vb[i] < gb[i])
{
v[c[gb[i]]].x = vb[i];
}
else
{
cout << "NO\n"; return;
}
if (vc[i] < hc[i])
{
v[b[hc[i]]].y = vc[i];
}
else
{
cout << "NO\n"; return;
}
}
shuchu(n);
}
signed main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t;
cin >> t;
while (t--)
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
memset(v, 0, sizeof(v));
solve();
}
}