A.Gamer Hemose

Problem Analysis

题目大意:给你一堆技能的伤害值Codeforces Round #746 (Div. 2) A、B_i++,以及敌人的血量Codeforces Round #746 (Div. 2) A、B_c++_02。要求同一技能不能连续重复使用。求至少使用多少次技能能够讲敌人的血量Codeforces Round #746 (Div. 2) A、B_c++_02降到Codeforces Round #746 (Div. 2) A、B_c++_04及以下?

思路:很明显的贪心,尽可能选取伤害大的技能打敌人,但是又不能连续使用同意技能。那么退而求其次就最大技能和次大技能交替使用。除法计算出需要多少次最大技能+次大技能(向下取整),如果这些次数的技能不足以杀死敌人,那么就额外单独判断一次是否达到。

Accepted Code

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int a[N];

signed main(){
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 0; cin >> t;
while(t--){
int n, h; cin >> n >> h;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
int div = floor(h / (a[n] + a[n - 1]));
if(div * (a[n] + a[n - 1]) >= h) cout << div * 2 << endl;
else{
int det = (h - (1.0 * div * (a[n] + a[n - 1])));
if(det <= a[n]) cout << div * 2 + 1 << endl;
else cout << div * 2 + 2 << endl;
}
}
return 0;
}

B.Hemose Shopping

Problem Analysis

题目大意:给你一个序列Codeforces Round #746 (Div. 2) A、B_i++,和Codeforces Round #746 (Div. 2) A、B_i++_06。你可以交换序列中任意两个满足Codeforces Round #746 (Div. 2) A、B_i++_07的元素。问经过有限次操作,序列能否变为有序序列。

思路:考虑非法情况:也就是Codeforces Round #746 (Div. 2) A、B_i++_06太大导致没有满足情况的元素可以交换:

  1. Codeforces Round #746 (Div. 2) A、B_c++_09,此时如果序列无序,那么肯定无法操作,直接输出"NO";
  2. Codeforces Round #746 (Div. 2) A、B_i++_10,此时只有一种情况不合法:前Codeforces Round #746 (Div. 2) A、B_c++_11个元素和后Codeforces Round #746 (Div. 2) A、B_c++_11个元素有重叠(Codeforces Round #746 (Div. 2) A、B_i++_13),且需要调换位置的元素位于前后Codeforces Round #746 (Div. 2) A、B_c++_11个元素的交集部分Codeforces Round #746 (Div. 2) A、B_i++_15,那么无法进行调换。此时直接输出"NO";

按理说,Codeforces Round #746 (Div. 2) A、B_#include_16的时候要判断以下序列是否有序的,但可能数据比较弱…直接否掉也过了…

Accepted Code

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int a[N], b[N];

inline void solve(){
int n = 0, x = 0; cin >> n >> x;
for(int i = 1; i <= n; i++){
cin >> a[i]; b[i] = a[i];
}
if(x > n){
cout << "NO" << endl;
return;
}
sort(a + 1, a + 1 + n);
for(int i = n - x + 1; i <= x; i++){
if(a[i] != b[i]){
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}

signed main(){
int t = 0; cin >> t;
while(t--) solve();
return 0;
}