Codeforces Round 937 (Div. 4)
Codeforces Round 937 (Div. 4)
B题是输出规律图形题,对于这种题不能直接不思考就上去模拟,而应该思考一下数学规律,往往是模意义下的规律。
本题只需要模4以后的结果分为两类,分别讨论即可。对于模4可以利用位运算取出第二位的,这与模2同理。
1 | char s1='#'; |
C:增加常识:12小时制没有0,是从1-12开始的,这符合时钟表盘下的数字。24小时制是没有24.
D:要求快速判断一个数能不能由只含若干0和1的数字相乘得到。
Solution:对于多次询问,我们提前打表预处理,实现查询。首先根据范围利用状态压缩得到范围内的可能01串,然后只需要将他们随意相乘能得到哪些数。
-
我只想到了dfs暴搜,到边界了就剪枝return
-
正解是跑完全背包,可达性统计
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34int a[N];
map<int,int>mp;
vector<int>v;
void dfs(int u){
if(u>100000)return ;
//cerr<<u<<endl;
mp[u]=1;
for(int i=0;i<30;i++){
dfs(u*v[i]);
}
}
void init(){
mp[100000]=1;
for(int i=1;i<32;i++){
int len=__lg(i);
string s;
for(int j=len;j>=0;j--){
if((i>>j)&1)s+="1";
else s+="0";
}
int num=stoi(s);
mp[num]=1;
//cerr<<num<<endl;
if(num!=1)v.push_back(num);
}
dfs(1);
//cerr<<v.size()<<endl;
}
void solve(){
cin>>n;
if(mp[n])cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
jiangly的代码学习一下
1 |
|
E:按照题意暴力模拟即可,需要注意的是
- 只有因子长度string才可能作为daan
- 需要拿两个子串分别check一遍,答案一定才被覆盖
1 | void solve(){ |
F:给定出度为0,1,2的点的具体数量为.要求构造一棵树高最小的树
Solution:首先很容易想到贪心方案:先把所有的2用完,然后再用1,最后补0。
-
对于无解情况的判断,利用出度和边的数量关系构造等式,不符合这个的直接无解
-
对于贪心的代码实现,非常的trick,利用bfs每次先把点的对应高度加进去,至于是哪种类型的点需要等到出队的时候再根据剩余情况分配。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27//2a+b=a+b+c-1
void solve(){
int a,b,c;cin>>a>>b>>c;
if(a+1!=c){
cout<<-1<<endl;
return ;
}
queue<int>q;
int x=0;int ans=0;
q.push(0);
while(q.size()){
auto u=q.front();
//cerr<<u<<endl;
q.pop();
ans=u;
if(a){
a--;
q.push(u+1);
q.push(u+1);
}
else if(b){
b--;
q.push(u+1);
}
}
cout<<ans<<endl;
}
G题: n个点,每个点有两种性质,两个点之间有一个性质相同就连边,图提前给定,求图上一条最长简单路径
Solution:对于这种一般图求最长路,在n范围较小的情况下,应该快速意识到是状态压缩的TSP类似问题。对于所有可能作为终点的点,计算他的最好状态中1的个数。
1 | void solve(){ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 爱飞鱼的blog!
