这场打的稀烂。。。
A. Mainak and Array
题意:将数组中某段子序列翻转一次,求a[n] - a[1]最大的值。
思路:有三种情况:
第一种,将最小的数翻转到第一位,然后用原来的a[n]减去反转后的a[1]。
第二种,将最大的数翻转到最后一位,用反转后的a[n]减去原来的a[1]。
第三种,整体翻转,使最大和最小两个数在a[n]和a[1]的位置,这就需要他们相邻。
代码:
void solve()
{
int n;
cin >> n;
int maxv = -INF, minv = INF;
int ans = 0;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
maxv = max(maxv, a[i]);
minv = min(minv, a[i]);
}
for(int i = 1; i < n;i ++)
{
ans = max(ans, a[i] - a[i + 1]);
}
ans = max(ans, max(maxv - a[1], a[n] - minv));
cout << ans << endl;
}
B. Mainak and Interesting Sequence
题意:给出数组的位数n和数组元素总和m,求是否存在一个数组使得每个元素,在数组中严格小于它的数的异或值为0。
思路:我的思路就是均分,这样的话就只需要看位数就可以判断是否异或为0。首先将m均分给n个元素,多的值后面补上即可。
如果没有剩下的数,说明可以均分,那么绝对满足条件,输出即可。
如果有剩下的数,如果n - 1是偶数,那么说明可以在最后一位加上剩下的数,那么对于这位数而言,比他小的数异或为0。
如果n - 1不是偶数,设剩下的数为t,将t均分到t个数上,观察n - t是否为偶数,不为偶数则不满足条件,为偶数则满足条件。
代码:
void solve()
{
int n, m;
cin >> n >> m;
vector<int> v(n, m / n);
if(m < n) //如果有数为0,则NO
{
cout << "No" <<endl;
return ;
}
int t = m - (m / n * n);
if(t == 0)
{
cout << "Yes" << endl;
for(int i = 0; i < n; i++) cout << v[i] << " \n"[i == n - 1];
return ;
}
if((n - 1) % 2 == 0)
{
cout << "Yes" << endl;
for(int i = 0; i < n; i ++)
{
if(i == 0) v[i] += t;
cout << v[i] << " \n"[i == n - 1];
}
return ;
}
if((n - t) % 2 == 1)
{
cout << "No" << endl;
return ;
}
cout << "Yes" <<endl;
for(int i = 0; i < n; i ++)
{
if(i < t) v[i] ++;
cout << v[i] << " \n"[i == n - 1];
}
}
C. Jatayu's Balanced Bracket Sequence
题意:比赛的时候没读懂。后来看的题解。这位大佬写的不错
代码:
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
n = 2 * n;
int res = 1;
for(int i = 0; i < n; i ++)
{
if(s[i] == '(') continue;
int j = i;
while(j + 1 < n && s[j + 1] == ')') j ++;
res += j - i;
i = j;
}
cout << res << endl;
}
标签:Code,Contest,int,cin,偶数,ans,Div,minv
From: https://www.cnblogs.com/lbzbk/p/16665757.html