我发现自己总是浮于表面,没办法认认真真的研究或者是学习某一件事情,因此,从今天开始,我会每天晚上写一篇总结,总结今天做了什么,可能是算法,论文,或者是生活上的琐事。
浙江省赛,自己看法,A-C, L,晚上会补I,G,还有完全背包,cf的e题。
题意:给你两个整数a,b,每一步只能加正奇数x或减正偶数y,多少步,可以让a变成b?
解析:如果a==b,则答案为0
如果a > b,那么a->b,必须得减数字。如果相差为偶数的话,1步即可。如果相差为奇数的话,先减2(a - b) ,再加(a - b),这样刚好是2步。
如果a<b,那么a->b,必须加数字。如果相差为奇数的话,1步即可。如果相差为偶数的话,需要分情况,6/2=3,4/2=2, 如果(b-a)/2,为奇数的话,两步即可。如果为偶数的话,还需要减一个偶数。
void solve()
{
int a, b; cin >> a >> b;
if (a == b) cout << 0 << endl;
else if (a < b)
{
if ((b - a) % 2) cout << 1 << endl;
else
{
if ((b - a) / 2 % 2 == 1) cout << 2 << endl;
else cout << 3 << endl;
}
}
else
{
if ((a - b) % 2 == 0) cout << 1 << endl;
else cout << 2 << endl;
}
}
```
B签到题。
题意:序列a,b,长度分别为n,m,在a中找大于等于x的个数,在b中找小于等于x的个数。
解析:可以直接暴力枚举,也可以二分,但是需要注意边界情况。还需要特判pos是否==x
如果找不到的话,就是在n+1或者在1位置上。
void solve()
{
int n, m, x; cin >> n >> m >> x;
vector<int>a(n + 1), b(m + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) cin >> b[i];
sort(a.begin() + 1, a.end());
sort(b.begin() + 1, b.end());
int res = 0;
int posa = lower_bound(a.begin() + 1, a.end(), x) - a.begin();
res += max((n - posa), 0);
if (a[posa] >= x) res++;
int posb = upper_bound(b.begin() + 1, b.end(), x) - b.begin();
posb--;
res += posb;
cout << res << endl;
}
题意:给定一个序列,在子序列里面找大于子序列平均值的最大数量。
题解:数字越小,平均值越小。因为小数字会拉低平均值,比如1 50 100,和40 50 100,我们倾向于选择小数字。因为我们从小到大枚举数字,算出平均值,再求出最大的个数。
void solve()
{
int n; cin >> n;
vector<int>a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a.begin() + 1, a.end());
int sum = 0;
int ans = 0;
for (int i = 1; i <= n; i++)
{
sum += a[i];
int l = upper_bound(a.begin() + 1, a.begin() + i, sum / i) - a.begin();
ans = max(ans, i - l + 1);
}
cout << ans << endl;
}
Codeforces Round #817 (Div. 4)的D题。
题意:一段序列,由L,R组成,各自朝向的个数,我们可以更改k个人的朝向,求朝向人数的最大值为多少?
解析:坐标从0开始,L的贡献值为i,R的贡献值为n-i-1,我们从中间分开,0->mid都是R,mid->n-1都为L,我们可以算出改变人的贡献值,排序,相加即可。
void solve()
{
int k; cin >> k;
string s; cin >> s;
int n = s.length();
int sum = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == 'R') sum += (n - i - 1);
else sum += i;
}
int mid = n / 2 - 1;
vector<int>sub;
for (int i = 0; i <= mid; i++)
{
if (s[i] == 'R') sub.push_back(0);
else sub.push_back((n - i - 1) - i);
}
for (int i = n - 1; i > mid; i--)
{
if (s[i] == 'L') sub.push_back(0);
else sub.push_back(i - (n - i - 1));
}
sort(sub.begin(), sub.end(), greater<int>());
for (int i = 0; i < k; i++)
{
if (i >= n)
{
cout << sum << " ";
continue;
}
sum += sub[i];
cout << sum << " ";
cout << endl;
}
}