Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
- Solved : 3 out of 6
- Rank : 1347
- A. Make a triangle!
- 难度: 普及?
- 数学题。。。若刚好能凑成三角形就输出0,否则,设a,b,c从大到小排序,则\(a+x+b>c ~-> ~a+x+b\leq c+1 ~->~ x=c-b-a+1\),其中x是最小增加次数。
#include
#include
#include
#include
#include
- B. Equations of Mathematical Magic
- 难度:普及?
- $a- (a \oplus b)-b= 0 ~->~ a \oplus b = a-b $
- 然后想到a中所有1的位xor b中1的位后是0,a中1的位减b中1的位也是0,得出一个猜想:ans为a的二进制下1的位数,然后用计算器看到大样例有30个1,而答案恰好为30。
- 直接得出结论。
#include
#include
#include
#include
#include
- C. Oh Those Palindromes
- 难度:普及?
- 本以为是个有点难度的构造题,结果把字符串排个序就完了。。。。。(被旁边的dalao疯狂嘲讽
- 乱搞一下样例可得出结论。(请不要问我证明。。。
- Summary :
- 先手玩一下样例,看能不能找到可以贪心或乱搞的地方。
- 若有猜想,先跑一下样例看看能不能过,如果大样例都过了的话。。。。
#include
#include
#include
#include
#include
- D. Labyrinth
- 难度:提高D1T2?
- 双端队列BFS。
- 向上和向下移动的代价都为0,向左或向右的代价为1。我们将花费代价为0的状态从队头入队,花费代价为1的状态从队尾入队。当一个状态第一次从队列中取出时,就得到了此状态的最优解。当然本题是要跑出所有可能的解而非求最优解。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 2000 + 100;
int n,m;
char mp[N][N];
struct node{
int x,y,l,r;
};
bool vis[N][N];
dequeq;
const int dirx[4]={-1,1,0,0};
const int diry[4]={0,0,-1,1};
void BFS(){
while(q.size()) {
node _=q.front();q.pop_front();
int x=_.x,y=_.y,l=_.l,r=_.r;
if(l<0||r<0) continue;
if(vis[x][y]) continue;
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dirx[i],yy=y+diry[i],ll=l,rr=r;
if(xx<1||xx>n||yy<1||yy>m||mp[xx][yy]=='*') continue;
if(i==2) ll--;
if(i==3) rr--;
if(i==0||i==1) q.push_front((node){xx,yy,ll,rr});
if(i==2||i==3) q.push_back((node){xx,yy,ll,rr});
}
}
}
int main() {
int R,C;
scanf("%d%d%d%d",&n,&m,&R,&C);
int X,Y;scanf("%d%d",&X,&Y);
for(int i=1;i<=n;i++) {
scanf("%s",mp[i]+1);
}
node _=(node){R,C,X,Y};
q.push_front(_);
BFS();
int ans=0;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++){
if(vis[i][j]) ans++;
}
}
printf("%d",ans);
return 0;
}
- E. Dwarves, Hats and Extrasensory Abilities
- 难度:提高D2T2?交互题不清楚
-
- F. Candies for Children
- 难度: 省选?
- 神仙题。