A
核心思路:首先我们得清楚一个点,那么就是如果有不符合条件的数列,那么我们也只有以下两种操作:
- 把其中一个偶数变为奇数
- 把其中一个奇数变为偶数
所以这个问题就迎刃而解了:我们只需要记录每一个数变为另外的数的最小操作数(也就是奇数变为偶数,偶数变为奇数),然后我们取一个最小值就好了.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
const int INF = 0x3fff;
void solve()
{
int n;
cin >> n;
int cnt = 0;
int ma = INF;
int yi=0;
for (int i = 0;i < n;i++)
{
cin >> a[i];
int b = a[i];
yi ^= a[i]&1;
int t = 0;
while (a[i] % 2 == b % 2)
{
t++;
b /= 2;
}
ma = min(ma, t);
}
cout << (yi ? ma : 0) << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
B
核心思路:我们一定要注意一个很重要的条件:那就是每次都得操作n次.所以我们直接构造\(2^n\)的数列就好了.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3fff;
int n, a;
//struct Node{
// int t;
//int idx;
//}a[N];
//int cmp(Node x, Node y)
//{
// return x.t < y.t;
//}
void solve()
{
cin >> n;
cout << n << endl;
for (int i = 1;i <= n;i++)
{
int x;
cin >> x;
int k = ceil(log2(x));
cout << i << " " << (1 << k) - x << endl;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
C
核心思路:这个题目明显是一个贡献题,遇到这个贡献题其实我们我们首先应该想的是前一个位置会对后一个位置产生什么影响,也就是s[i]对s[i-1]的影响.所以就是一个前后的递推关系,至于这个关系怎么得到呢,我们可以先根据样例来模拟来推导这个最一般的关系,然后再把这种情况推导到一般的情况。
这个题目我们可以很明显的看出这种递推关系:
- \(s[i]!=s[i-1]\),那我们的上一个位置对这个位置就直接加倍了:last*2;
- \(s[i]==s[i-1]\),那我们的上一个位置对我们这个位置基本没有贡献:last=1;
所以我们只需要枚举last就好了,然后迭代更新就好了.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3fff;
int n, a;
int mod = 998244353;
typedef long long LL;
//struct Node{
// int t;
//int idx;
//}a[N];
//int cmp(Node x, Node y)
//{
// return x.t < y.t;
//}
void solve()
{
cin >> n;
string s;
cin >> s;
s = "?" + s;
LL ans = 0;
LL last = 0;
for (int i = 1;i <= n;i++)
{
if (s[i] == s[i - 1])
{
last = last * 2 % mod;
ans =(ans+last)%mod;
}
else
{
last = 1;
ans=(ans+1)%mod;
}
}
cout << (ans % mod+mod)%mod << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
d题待补,因为有点看不动题目。
标签:Node,const,int,838,Codeforces,cin,solve,last,Div From: https://www.cnblogs.com/xyh-hnust666/p/16988807.html