G - Remove a Progression
解法
规律题目,给你一个长度为
n
n
n的序列,从
1...
n
1...n
1...n
一个算法,地
i
−
t
h
i-th
i−th都会将序列中第
i
i
i个数取走.
问不能取的时候,第
x
x
x个数是多少,保证
x
x
x的合法性.
多写几个
n
n
n就发现序列只剩偶数,输出
2
∗
x
2*x
2∗x即可.
#include<cstdio>
#include<string>
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
using namespace std;
typedef unsigned long long ull;
const int MAXN = 1e5 + 10;
int main()
{
int t;
cin >> t;
while (t--) {
int n, x;
cin >> n >> x;
cout << 2 * x << endl;
}
return 0;
}
H - Yet Another Crosses Problem
解法
给你一个图,图上的点要么是
′
#
′
'\#'
′#′,要么是
′
.
′
'.'
′.′,当
′
#
′
'\#'
′#′是整行且整列,才认为图里有一个十字架.
给你一个图,问最少要涂几个点才能有一个十字架.
贪心找即可.
预处理存下一行和一列的
′
.
′
'.'
′.′的个数,然后遍历即可.
注意的是,如果一行和一列的交叉是
′
.
′
'.'
′.′,需要把答案
−
1
-1
−1.
#include<cstdio>
#include<string>
#include<iostream>
#include<map>
#include<string.h>
#include<algorithm>
#include<set>
using namespace std;
typedef unsigned long long ull;
const int MAXN = 5e4 + 10;
int a[MAXN], b[MAXN];
string s[MAXN];
int main()
{
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (int i = 0; i < n; i++) {
cin >> s[i];
for (int j = 0; j < m; j++)
if (s[i][j] == '.')
a[i]++, b[j]++;
}
int minn=4*5e5;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (s[i][j] == '.')
minn = min(minn, a[i] + b[j] - 1);
else
minn = min(minn, a[i] + b[j]);
cout <<minn<<endl;
}
return 0;
}
I - From S To T
题目大意
给你三个字符串
s
,
t
,
p
s,t,p
s,t,p.
操作
o
p
t
opt
opt为可以将
p
p
p中的任意长子串放进
s
s
s的任意位置.
问你能不能通过
o
p
t
opt
opt把
s
s
s变成
t
t
t.
解法
先看在
s
s
s,是不是可以变成
t
t
t.即,只要
s
s
s有的,
t
t
t都有,而且顺序也是相同即可.
再看
p
p
p中的字母可不可以补全
s
s
s.就解决了.
#include<cstdio>
#include<string.h>
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
using namespace std;
typedef unsigned long long ull;
const int MAXN = 1e2 + 10;
char s[MAXN], t[MAXN], p[MAXN];
int main()
{
int n;
cin >> n;
while (n--) {
cin >> s >> t >> p;
int len1 = strlen(s), len2 = strlen(t), len3 = strlen(p);
int j = 0;
for (int i = 0; i < len2&&j<len1; i++)
if (s[j] == t[i])
j++;
if (j != len1) {
cout << "NO" << endl;
continue;
}
map<char, int>mp;
for (int i = 0; i < len1; i++)
mp[s[i]] ++;
for (int i = 0; i < len3; i++)
mp[p[i]] ++;
bool f = 1;
for (int i = 0; i < len2; i++)
if (mp[t[i]])
mp[t[i]]--;
else{
cout << "NO" << endl;
f = 0;
break;
}
if (f)
cout << "YES" << endl;
}
return 0;
}