《看了受制了》第四十三天,8道题,合计269道题
2023年10月17日
Div.3 Round855 A Is it a cat?
题目大意
问是不是由m或M,o或O,e或E,w或W,组成的字符串,且顺序一定是meow
题目理解
其实只要转为小写去重即可。
我写成屎山了
代码实现
void solve()
{
int n;
string s;
cin >> n >> s;
int flag = 0;
for(int i = 0; i < n; i++)
{
if(s[i] != 'm' && s[i] != 'M' && s[i] != 'e' && s[i] != 'E' && s[i] != 'o' && s[i] != 'O' && s[i] != 'w' && s[i] != 'W')
{
cout << "NO" << endl;
return;
}
if(flag == 0){
if(s[i] != 'm' && s[i] != 'M')
{
cout << "NO" << endl;
return;
}else if(s[i] == 'M' || s[i] == 'm'){
flag = 1;
}
}
if(flag == 1){
if(s[i] != 'm' && s[i] != 'M' && s[i] != 'e' && s[i] != 'E')
{
cout << "NO" << endl;
return;
}else if(s[i] == 'e' || s[i] == 'E')
{
flag = 2;
}
}
if(flag == 2)
{
if(s[i] != 'e' && s[i] != 'E' && s[i] != 'o' && s[i] != 'O')
{
cout << "NO" << endl;
return;
}else if(s[i] == 'o' || s[i] == 'O')
{
flag = 3;
}
}
if(flag == 3)
{
if(s[i] != 'o' && s[i] != 'O' && s[i] != 'w' && s[i] != 'W')
{
cout << "NO" << endl;
return;
}else if(s[i] == 'w' || s[i] == 'W')
{
flag = 4;
}
}
if(flag == 4 && s[i] != 'w' && s[i] != 'W')
flag = 5;
}
if(flag == 4)
cout << "YES" << endl;
else
cout << "NO" << endl;
return;
}
Div.3 Round855 B
题目大意
问有多少对大小写字符,然后有k次机会可以把大小转小写,小写转大写。
题目理解
一开始统计各自出现的次数,然后一开始即可转换,再加上k个能组成的对数就行。
代码实现
void solve()
{
int n, k;
cin >> n >> k;
string s;
cin >> s;
vector<int> a(28), b(28);
for(int i = 0; i < n; i++)
if(s[i] >= 'a' && s[i] <= 'z')
a[s[i] - 'a' + 1]++;
else
b[s[i] - 'A' + 1]++;
int res = 0, cnt = 0;
for(int i = 1; i <= 27; i++)
{
res += min(a[i], b[i]);
cnt = max(a[i], b[i]) - min(a[i], b[i]);
if(cnt / 2 > k){
res += k;
k = 0;
} else{
res += cnt / 2;
k -= cnt / 2;
}
}
cout << res << endl;
return;
}
牛客Round15 A 游游的整数切割
题目理解
原数字是偶数的话,只能分割偶数,原数字是奇数的话只能分割奇数,所以统计奇数和偶数在n-1出现的次数即可。
代码实现
void solve()
{
string s;
cin >> s;
int cnt1 = 0, cnt2 = 0;
for(int i= 0 ; i < s.size() - 1 ; i++)
if((s[i] - '0') % 2 == 0)
cnt1++;
else
cnt2++;
if((s[s.size() - 1] - '0') % 2 == 0)
cout << cnt1;
else
cout << cnt2;
return;
}
蓝桥杯双周赛E 奇怪的线段
题目理解

代码实现
const int N = 2e6+10,mod=1e9+7;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
int n,m,k;
struct Node
{
int s,e;
int id,op;
}node[N];
int tr[N];
int lowbit(int x)
{
return x & -x;
}
void add(int x, int c) // 位置x加c
{
for (int i = x; i <= N; i += lowbit(i)) tr[i] += c;
}
int sum(int x) // 返回前x个数的和
{
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
bool cmp(const Node&n1,const Node&n2){
if(n1.e == n2.e)
{
if(n1.s!=n2.s) return n1.s<n2.s;
return n1.op<n2.op; // 最好先插入点
}
return n1.e>n2.e; // 按照右端点排序
}
int res[N];
int d[N];
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int l,r;
cin>>l>>r;
if(l>r) swap(l,r);
d[l]++,d[r+1]--;
node[i]={l,r,0,0};
}
for(int i=1;i<N;i++) d[i]+=d[i-1];
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
res[i]=d[a];
if(a>b) swap(a,b);
node[++n]={a,b,i,1}; // a和b交换了位置,如何区分不包含b
}
sort(node+1,node+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(node[i].op==0)
{
add(node[i].s,1); //
}
else
{
// node id就是第几个操作,res中存的是对于第i个询问,包含a的集合数量
res[node[i].id]-=sum(node[i].s); // 在当前区间中有多少个包含b
}
}
for(int i=1;i<=m;i++) cout<<res[i]<<"\n";
}
Atcoder ABC 324 A
题目大意
所有数字是否相同
代码实现
void solve()
{
int n;
cin >> n;
int a, b;
cin >> a;
int flag = 1;
for(int i = 2; i <= n; i++)
{
cin >> b;
if(b != a)
flag = 0;
}
if(flag) cout << "Yes";
else cout << "No";
return;
}
Atcoder ABC324 B
题目大意
一个数是否是\(2^x * 3^y\)。
代码实现
void solve()
{
ll n;
cin >> n;
while(n)
{
if(n % 2 == 0) n /= 2;
if(n % 3 == 0) n /= 3;
if(n % 3 != 0 && n % 2 != 0)break;
}
if(n == 1)cout << "Yes";
else cout << "No";
return;
}
Atcoder ABC324 C
题目大意
一个字符串是否可以从以下四种方式转移过来:
- 直接相同
- 只有一个不同
- 增添一个字符
- 删除一个字符
代码实现
int n;
string s;
bool check(string t)
{
int cnt = 0;
for(int i = 0; i < (int)s.size(); i++)
if(s[i] != t[i])
cnt++;
if(cnt == 1) return true;
return false;
}
bool is_equal(string t) // 删除一个
{
int flag = 0;
for(int i = 0, j = 0; i < (int)t.size(); i++, j++)
if(t[i] != s[j])
{
j++;
flag++;
if(t[i] != s[j]) return false;
}
if(flag == 1 || flag == 0)
return true;
return false;
}
bool is_equal2(string t) // 增加一个
{
int flag = 0;
for(int i = 0, j = 0; i < (int)s.size(); i++, j++)
if(t[j] != s[i])
{
j++;
flag++;
if(t[j] != s[i]) return false;
}
if(flag == 1 || flag == 0) return true;
return false;
}
void solve()
{
cin >> n >> s;
vector<int> res;
for(int i = 1; i <= n; i++)
{
string t;
cin >> t;
// 相等
if(s == t)
{
res.push_back(i);
continue;
}
// 是否只有一个字母不相同
if(s.size() == t.size() && check(t))
{
res.push_back(i);
continue;
}
if((int)s.size() - 1 == (int)t.size() && is_equal(t))
{
res.push_back(i);
continue;
}
if((int)s.size() + 1 == (int)t.size() && is_equal2(t))
{
res.push_back(i);
continue;
}
}
cout << res.size() << endl;
for(int i = 0; i < (int)res.size(); i++)
cout << res[i] << " ";
return;
}
Acwing292 炮兵阵地
题目理解

代码实现
const int N = 110, M = 10, S = (1 << M) + 10;
int n, m;
int g[N];
int f[2][S][S];
vector<int> state;
int cnt[S];
bool check(int u)
{
for(int i = 0; i < m; i++)
if(u >> i & 1 && (((u >> (i + 1)) & 1) || ((u >> (i + 2)) & 1)))
return false;
return true;
}
int count(int u)
{
int res = 0;
for (int i = 0; i < m; i ++ )
if (u >> i & 1)
res ++ ;
return res;
}
void solve()
{
cin >> n >> m;
// 获取初始地图
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
char c;
cin >> c;
if(c == 'H') g[i] += 1 << j;
}
// 获取合法状态
for(int i = 0; i < (1 << m); i++)
if(check(i))
{
state.push_back(i);
cnt[i] = count(i);
}
for(int i = 0; i < n + 2; i++)
for(int j = 0; j < (int)state.size(); j++)
for(int k = 0; k < (int)state.size(); k++)
for(int u = 0; u < (int)state.size(); u++)
{
int a = state[u], b = state[j], c = state[k];
if((a & b) || (a & c) || (b & c)) continue; // 没有交集
if(g[i] & c) continue; // 不放山上
f[i & 1][j][k] = max(f[i & 1][j][k], f[(i - 1) & 1][u][j] + cnt[c]);
}
cout << f[(n + 1) & 1][0][0];
return;
}

浙公网安备 33010602011771号