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;}
}
❀完结撒花❀~