cf -1083-div3前五题思路
A Eating Game
其实就是找最大值一共有几个
void solve()
{
int mx = 0;
cin >> n;
int cnt = 0;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x > mx)
{
mx = x;
cnt = 1;
}
else if (x == mx)
cnt++;
}
cout << cnt << endl;
}
B Deletion sort
很显然的遍历数组,如果能找到一组逆序对,那么可以先把其他所有元素都删掉,然后这两个数随便删一个,这样操作必然剩一个,如果不能找到逆序对,那么就不能删。
void solve()
{
cin >> n;
bool ok = 1;
vi a(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] < a[i - 1] && i != 1)
{
ok = 0;
}
}
if (!ok)
{
cout << 1 << endl;
}
else
{
cout << n << endl;
}
}
C Specialty String
可以像括号序列那样来做,因为如果能变星号的话,一定是一对一对的变,所以这种对子可以互相消除,可以认为如果栈顶和入栈元素相同,那么就可以消除,如果全消除了,就说明全为‘*’了。
void solve()
{
cin >> n;
cin >> s;
stack<char> p;
for (int i = 0; i < n; i++)
{
if (!p.empty() && p.top() == s[i])
{
p.pop();
}
else
{
p.push(s[i]);
}
}
if (p.empty())
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
D Portal
俩传送门,然后你左我右,你右我左这样传送。显然中间的可以循环重排,那么我们可以找到中间数组最小数,将最小数作为开头,一直到最后,然后再从开始到最小数前,这就是新的中间数组。再从剩下的里面找第一个大于中间数组最小值的数,将中间数组插到这个数前面就行了
void solve()
{
cin >> n >> x >> y;
vi a(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
vi b, c;
for (int i = x + 1; i <= y; i++)
{
b.push_back(a[i]);
}
int mi = 0;
for (int i = 0; i < b.size(); i++)
{
if (b[i] < b[mi])
{
mi = i;
}
}
vi tb;
for (int i = mi; i < b.size(); i++)
{
tb.push_back(b[i]);
}
for (int i = 0; i < mi; i++)
{
tb.push_back(b[i]);
}
b = tb;
for (int i = 1; i <= x; i++)
{
c.push_back(a[i]);
}
for (int i = y + 1; i <= n; i++)
{
c.push_back(a[i]);
}
int op = c.size();
for (int i = 0; i < c.size(); i++)
{
if (c[i] > b[0])
{
op = i;
break;
}
}
for (int i = 0; i < op; i++)
{
cout << c[i] << " ";
}
for (int i = 0; i < b.size(); i++)
{
cout << b[i] << " ";
}
for (int i = op; i < c.size(); i++)
{
cout << c[i] << " ";
}
cout << endl;
}
E Divisive Battle
先判断一开始是否是非递减的,如果是bob就赢了。
想一下,如果一个数有两个或以上的质因数,可以把最小的质因数分解放在右面,这样无论怎么样Alice都赢了。
如果一个数只有一个质因数(质数的幂)或者说是1,那么他对结果的贡献就是这个质数或者1。
所以,构建一个新数组,分析每个元素是1,还是单质数的幂,还是有两个以上的质因数。
如果这个数组只有1,单质数的幂,那么直接看看新数组是不是非递减就行了,如果不是那么Alice就赢了。
void solve()
{
cin >> n;
vi a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
vi b(n);
for (int i = 0; i < n; i++)
{
b[i] = op(a[i]);
}
if (is_sorted(all(a)))
{
cout << "Bob" << endl;
}
else if (*min_element(all(b)) == -1)
{
cout << "Alice" << endl;
}
else if (is_sorted(all(b)))
{
cout << "Bob" << endl;
}
else
{
cout << "Alice" << endl;
}
}
最后想写以前没咋用过的几个函数
*min_element(all(a)),找a数组最小元素
*max_element(all(a)),找a数组最大元素
fill(all(a),x),把所有元素设为x;
is_sort(all(a)),判断a数组是不是非递减的

浙公网安备 33010602011771号