ABC363 题解
A - Piling Up (模拟)
题意:
输入一个数字,数字介于
1
1
1-
99
99
99显示了一次^
,
100
100
100-
199
199
199显示了^
两次…增加显示的所需的最小的评分增幅
分析:
算比次数字大且为 100 100 100的倍数的最小值减此数字
代码:
void solve(){
int n;
cin >> n;
int t = n / 100;
cout << (t + 1) * 100 - n;
}
B - Japanese Cursed Doll(也是模拟)
题意:
有
N
N
N 个人,第
i
i
i 个人的头发长度为
l
i
l_i
li 。每人头发每天增长
1
1
1 根~~(这是什么增长速度啊,菜就多练)~~。打印头发长度至少为
t
t
t 的人数首次变为
p
p
p 或更多的天数。如果现在头发长度至少为
t
t
t 的人数已经为
p
p
p 或更多,则打印0
。
分析:
如果当前头发长度至少为
t
t
t 的人数已经比
p
p
p 多了,输出0
。反之,将他们排序从小到大,输出第n-p
个人头发长到
t
t
t 要多久。
代码:
int a[N];
void solve(){
int n, t, p;
cin >> n >> t >> p;
for(int i = 0; i < n; i++){
cin >> a[i];
}
sort(a, a + n);
if(t - a[n - p] <= 0) cout << "0" << endl;
else cout << t - a[n - p] << endl;
}
C - Avoid K Palindrome 2
题意:
给定长度为 n n n 的字符串,求 s s s 中的字符任意交换顺序后得到的字符串中,不包含长度为k的回文字符串作为子串的个数
分析:
长度最长为10
,直接全排列枚举每次字符串的情况,然后用判断是否有长度为
k
k
k的回文字符串,如果没有ans+1
。
代码:
string s,t,x;
char tmp[N];
int n,m,cnt;
void solve(){
int f;
cin>>n>>m>>tmp;
for(int i = 0;i <= n - 1;i++)
s += tmp[i];
sort(s.begin(),s.end());
do
{
f = 1;
for(int i = 0;i <= n - m;i++)
{
t = s.substr(i,m);
x = t;
reverse(t.begin(),t.end());
if(x == t)
{
f = 0;
break;
}
}
cnt += f;
}while(next_permutation(s.begin(), s.end()));
cout << cnt << endl;
}
D - Palindromic Number
题意:
十分清楚,十分明白,自己看题
思路
其实很简单,根据需要的第 i i i 项进行判断即可
void work(int q, long long w, int f) {
string e = to_string(w + n - 1);
e.resize(f, ' ');
for (int i = q; i < f; i++) e[i] = e[f - 1 - i];
cout << e << endl;
}
void solve() {
cin >> n;
if(n == 1) {
puts("0");
return;
}
n--;
for(int i = 1; ; i ++) {
int q = i + 1 >> 1;
long long w = pow(10, q - 1);
w = (w << 3) + w;
if(n <= w) {
work(q, w / 9, i);
return;
} else n -= w;
}
}
E - Sinking Land
题意
当地段高度小于等于海平面的时候就可以称之为沉没,海平面每年升高1
,问Y
年后中各有多少个地段没有沉没
分析
模拟题,我用了优先队列优化的bfs
,我们只需要把跟海
接触
\textcolor{red}{接触}
接触的放到queue
里面,然后一直判断就行。
代码:
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
struct node {
int x, y, v;
bool operator > (const node& a) const {
return v > a.v;
}
};
inline void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> a(n + 1, vector<int>(m + 1)), vis(n + 1, vector<int>(m + 1));
priority_queue<node, vector<node>, greater<node>> q;
for (int i = 1; i <= n; i++ ) {
for (int j = 1; j <= m; j++ ) {
cin >> a[i][j];
if (i == 1 || i == n || j == 1 || j == m) q.push({i, j, a[i][j]}), vis[i][j] = 1;
}
}
int ans = n * m;
for (int i = 1; i <= k; i++) {
while (q.size() && q.top().v <= i) {
node T = q.top();
q.pop();
int x = T.x, y = T.y, v = T.v;
ans -= 1;
for (int i = 0; i < 4; i++) {
int x1 = x + dx[i], y1 = y + dy[i];
if (x1 < 1 || x1 > n || y1 < 1 || y1 > m || vis[x1][y1]) continue;
q.push({x1, y1, a[x1][y1]});
vis[x1][y1] = 1;
}
}
cout << ans << endl;
}
}
❀完结撒花❀~