Codeforces Round 894 (Div. 3)
A. Gift Carpet
根据题意扫描每列找到“vika”即可
void solve(){
cin >> n >> m;
char mp[22][22];
for(int i = 1;i <= n;i++)
cin >> mp[i];
string tp = " vika";
int p = 1;
for(int j = 0;j < m;j++){
for(int i = 1;i <= n;i++){
if(mp[i][j] == tp[p]){
p++;
break;
}
}
if(p == 5){
cout << "YES\n";
return;
}
}
cout << "NO\n";
}
B. Sequence Game
遍历b中每个数,若该数比前一个小,则在该数前插入1即可
void solve(){
cin >> n;
for(int i = 1;i <= n;i++) cin >> b[i];
m = n;
a[1] = b[1];
for(int i = 2, j = 2;i <= n;i++, j++){
if(b[i] < a[j-1]){
a[j++] = 1;
m++;
}
a[j] = b[i];
}
cout << m << '\n';
for(int i = 1;i <= m;i++) cout << a[i] << ' ';
cout << '\n';
}
C. Flower City Fence
模拟数组将翻转即可
void solve(){
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
a[n+1] = 0;
if(a[1] != n){
cout << "NO\n";
return;
}
int h = 1;
for(int i = 1, j = a[1];i <= n;i++, h++){
while(a[i] == a[i+1]){
h++;
i++;
}
while(j > a[i + 1]){
b[j] = h;
j--;
}
}
b[1] = n;
for(int i = 1;i <= n;i++){
if(a[i] != b[i]){
cout <<"NO\n";
return;
}
}
cout << "YES\n";
}
D. Ice Cream Balls
先找出最大的k,k*(k - 1) / 2 <= n
答案为k + n - (k * (k - 1) / 2)
void solve(){
cin >> n;
int l = 2, r = 2e9;
while(l <= r){
int mid = l + r >> 1;
if((mid * (mid - 1)) / 2 > n) r = mid - 1;
else l = mid + 1;
}
l--;
int ans = l + (n - (l * (l - 1)) / 2);
cout << ans << '\n';
}
E. Kolya and Movie Theatre
设看的最后一场电影是第bk场,总共降低的价值等于bk * d
求出每个位置作为最后一场时能选的最大m个数的和取最大即可
void solve(){
cin >> n >> m >> d;
for(int i = 1;i <= n;i++) cin >> a[i];
priority_queue<int, vector<int>, greater<int>>q;
int sum = 0, ans = 0;
for(int i = 1;i <= n;i++){
if(a[i] > 0) q.push(a[i]), sum += a[i];
if(q.size() > m) sum -= q.top(), q.pop();
ans = max(ans, sum - d * i);
}
cout << ans << '\n';
}
F. Magic Will Save the World
所有怪兽血量总和不超过1e6,直接01背包枚举所有可能出现的几个怪兽血量和 i i i,设水魔法消灭了i,火消灭了(sum - i),需要的时间为 m a x ( ⌈ i / w ⌉ , ⌈ ( s u m − i ) / f ⌉ ) max(\lceil i/w \rceil , \lceil (sum - i) / f \rceil ) max(⌈i/w⌉,⌈(sum−i)/f⌉)
void solve(){
cin >> w >> f >> n;
int sum = 0;
for(int i = 1;i <= n;i++) cin >> a[i], sum += a[i];
vector<int>dp(sum + 1, 0);
dp[0] = 1;
for(int i = 1;i <= n;i++){
for(int j = sum;j >= a[i];j--){
dp[j] |= dp[j - a[i]];
}
}
int ans = sum;
for(int i = 0;i <= sum;i++) if(dp[i]){
ans = min(ans, max((i + w - 1) / w, (sum - i + f - 1) / f));
}
cout << ans << '\n';
}