Educational Codeforces Round 88 (Rated for Div. 2) A-D题解
链接:https://codeforces.com/contest/1359
A. Berland Poker
题意:
现在有$n$张牌,$m$张王,共有$k$个人,每个人分得$frac{k}{n}$张牌,你的得分是你手中王牌的个数减去其余人中拥有最多王牌的个数,求最大得分
思路:
分类讨论一下即可,如果$m$大于$left lceil frac{k}{n} ight ceil$,那么答案就为$left lceil frac{m-left lceil frac{k}{n} ight ceil}{k-1} ight ceil$
否则,答案就为$m$
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--){ int n,m,k; cin>>n>>m>>k; int num=n/k; if(n%k!=0) num++; if(m>num){ int cnt=(m-num)/(k-1); if((m-num)%(k-1)!=0) cnt++; cout<<num-cnt<<endl; } else cout<<m<<endl; } return 0; }
B. New Theatre Square
题意:
在$n*m$的二维区域内有黑色和白色两种瓷砖,现在你要覆盖白色的瓷砖,你可以选择花费$x$元覆盖一个瓷砖,也可以选择花$y$元覆盖同一行的连续两个瓷砖,求覆盖掉所有白色瓷砖的最小花费
思路:
如果$2*x≤y$的话,答案就为$x*num$,$num$为白色瓷砖的个数
否则,就遍历整个区域,如果$(x,y)$位置是白色瓷砖,那么就观察$(x,y+1)$处,如果也是白色瓷砖就花费$y$元将两块瓷砖同时覆盖,否则就花$x$元
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e3+5; char a[N][N]; int main(){ int t; cin>>t; while(t--){ ll n,m,x,y,num=0; cin>>n>>m>>x>>y; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='.') num++; } if(x*2<=y) cout<<num*x<<endl; else { ll ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(a[i][j]=='.'){ if(j<m&&a[i][j+1]==a[i][j]) ans+=y,j++; else ans+=x; } } cout<<ans<<endl; } } return 0; }