Educational Codeforces Round 73 (Rated for Div. 2)
2048 Game (手速)
在 multiset 中玩 2048 游戏,能构成一个 2048 输出 yes
int n,m,t;
int i,j,k;
map<int,int> mp;
int main()
{
//IOS;
const int aim=2048;
rush(){
sd(n);
mp.clear();
for(i=1;i<=n;i++){
int x; sd(x);
mp[x]++;
}
if(mp.count(aim)){ puts("YES"); continue; }
for(int i=1;i<aim;i=i*2){
int cnt=mp[i]/2;
//debug(cnt);
mp[i<<1]+=cnt;
}
if(mp[aim]) puts("yes");
else puts("no");
}
//PAUSE;
}
B. Knights(规律)
在 n*n 的棋盘上,有黑白马,不同颜色的相互攻击,马走日,求如何布置他们使得攻击次数最多
借用一下题目当中的图
在下图中,蓝色与绿色环属于蓝色方块,粉红色环属于行色方块
蓝色环为红色方块可以攻击的对象
粉红色环是蓝色环的攻击对象
绿色环是粉红色环的攻击对象
![]()
这样就可以找到规律:
奇数行奇数列放 蓝色,偶数行偶数列放 蓝色,其余放 红色
const int N=100+5;
int n,m,t;
int i,j,k;
char ch[N][N];
int main()
{
while(sd(n)==1)
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
int now=i+j;
if(now&1) ch[i][j]='W';
else ch[i][j]='B';
pc(ch[i][j]);
}
puts("");
}
}
Perfect Team
参加比赛的有 3 种人,分别是 a,b,c 每个队至少有 一个 a 和一个 b,c 可选可不选 ,三人一队,最多可以形成多少队
假设 min=min(a,b)
如果 min<=c 答案为 ans
如果 min>c ,那么消耗完了 c 之后, a,b 两种人组队
即 a=a-min,b=b-min
每个队里含 2a+b 或 2b+a
这个问题之前做过
int main()
{
//IOS;
rush(){
Pair a[3];
sddd(a[0].fr,a[1].fr,a[2].fr);
a[0].sc=0,a[1].sc=1,a[2].sc=2;//映射原位置
sort(a,a+3);
ll ans=a[0].fr;
a[1].fr-=a[0].fr,a[2].fr-=a[0].fr,a[0].fr=0;
if(a[0].sc==2){
int x=a[1].fr;
int y=a[2].fr;
if(y>=2*x) ans+=x;
else{
int tmp=y-x;
ans+=tmp;
ans+=(x-tmp)*2ll/3;
}
}
pll(ans);
}
// PAUSE;
}
Make The Fence Great Again(DP)
给出 n 个栅栏的高度及伸长 1 米的价格,要使得相邻的栅栏不能是相同高度,最少的花费
本来想同模拟来做,但是每次更改长度后都要对区间进行一次排序,复杂度比较高,就放弃了
每一个栅栏最多伸长 2 米,假设 a[i-1]=x-1,a[i]=x,a[i+1]=x+1,这是最坏的情况
我们要考虑第 i 个到底伸长几米取决于第 i-1 个,选取 i-1,i,i+1 中花费最少的那一种方案
const int N=3e5+5;
int n,m,t;
int i,j,k;
Pair p[N];
map<int,int> mp;
ll dp[N][3];
int main()
{
//IOS;
rush(){
sd(n);
mp.clear();
for(i=1;i<=n;i++){
sd(p[i].fr);//高度
sd(p[i].sc);//价格
dp[i][0]=dp[i][1]=dp[i][2]=1e18;
}
dp[1][0]=0;
dp[1][1]=p[1].sc;
dp[1][2]=p[1].sc*2ll;
for(i=2;i<=n;i++){
for(j=0;j<3;j++){
for(k=0;k<3;k++){
if(p[i].fr+j != p[i-1].fr+k){
//第 i 个在第 i-1个伸长 k 米的情况下伸长 j 米
dp[i][j]=min(dp[i][j],dp[i-1][k]+p[i].sc*1ll*j);
}
}
}
}
cout<<min( min(dp[n][0],dp[n][1]),dp[n][2] )<<endl;
}
//PAUSE;
}