题目链接:Divide by three, multiply by two
第一次做div3的题,D题还是很简单的,题目意思:
给出一系列数字,要求我们给数组排序,后面一位是前面一位除以3或者乘以2得到的,我们发现这个数组最大为100,那么我们就可以很快地想到深搜,并且一定存在答案
在第一位置的时候,我们不需要进行判断,直接放到数组中,后面每一个元素的添加,必须满足我们之前的条件,这样满足条件的很好,所以深搜很快就会完成
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <algorithm> #define INF 0x3f3f3f3f #define ll long long using namespace std; const int MAXN = 150; int n; ll a[MAXN],ans[MAXN]; bool vis[MAXN]; void Dfs(int pos) { if(pos == n) { for(int i = 0;i < n;i ++) printf("%I64d%c",ans[i],i==n-1?'\n':' '); return ; } for(int i = 0;i < n;i ++) { if(pos == 0) { vis[i] = true; ans[pos] = a[i]; Dfs(pos+1); vis[i] = false; } if(vis[i] == false) { if(a[i] * 3 == ans[pos-1] || ans[pos-1] * 2 == a[i]) { vis[i] = true; ans[pos] = a[i]; Dfs(pos+1); vis[i] = false; } } } return ; } int main() { memset(vis,false,sizeof(vis)); scanf("%d",&n); for(int i = 0;i < n;i ++) scanf("%I64d",&a[i]); Dfs(0); return 0; }
题目要求我们找出所有点的子集满足:所有点连接形成一个环,并且不能有其他多余的边,也就是在这个环上的每个点的度只能是2,我们要找这样子集的个数
我们已知上面的条件,每个点的度只能是2,那么我们就枚举每一个度为2的点,然后判断相互连接的度数为2的点,一直向后遍历,判断最终是否回到起点,并且环中点的个数大于2
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <algorithm> #define INF 0x3f3f3f3f #define ll long long using namespace std; const int MAXN = 410000; struct Edge { int u,v,next; }edge[MAXN]; int head[MAXN],n,m,in_drgee[MAXN],k,P,num; bool vis[MAXN]; void Add_edge(int u,int v) { edge[k].u = u;edge[k].v = v;edge[k].next = head[u];head[u] = k++; } int dfs(int pos) { vis[pos] = true; int ans = 0; for(int i = head[pos];i != -1;i = edge[i].next) { int v = edge[i].v; if(vis[v] == false && in_drgee[v] == 2) { num++; ans += dfs(v); num--; } if(v == P && num >= 2) { return 1; } } return ans; } int main() { k = 0; memset(in_drgee,0,sizeof(in_drgee)); memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); int x,y; for(int i = 0;i < m;i ++) { scanf("%d%d",&x,&y); Add_edge(x,y); Add_edge(y,x); in_drgee[x] ++;in_drgee[y] ++; } int ans = 0; memset(vis,0,sizeof(vis)); for(int i =1 ;i <= n;i ++) { if(vis[i] == false && in_drgee[i] == 2) { P = i;num = 0; ans += dfs(i); } } printf("%d\n",ans); }