C. Anadi and Domino
C. Anadi and Domino
题目链接:http://codeforces.com/contest/1230/problem/C
time limit per test:
2 secondsmemory limit per test:
256 megabytesinput:
standard inputoutput:
standard output题目大意:
两个骰子可以进行组合,第一个大于等于第二个骰子,每个骰子6种情况所以一共有21中图形。给一个无向图,向边上放置上述图形,要求可以有的边上没有骰子,并且边上的骰子一部分对着一个点,要求对着一个点的所有骰子的点数相同。输出可以放置图形的最大值。
思路:
暴力列举出所有的点的临近部分骰子的点数,然后进行判断,在每种情况下有多少个边上可以放置两个骰子组成的图形。然后输出最大值。
代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef pair<int,int > P;
4 const int N=100;
5 int vis[N][N];
6 int arr[N];
7 int n,m,a,b,ans=0,cnt=0;
8 P mp[N];
9 void check(){
10 int u,v;
11 memset(vis,0,sizeof(vis));
12 cnt=0;
13 for(int i=0;i<m;i++){
14 u=arr[mp[i].first];
15 v=arr[mp[i].second];
16 if(u>v){
17 swap(u,v);
18 }
19 if(vis[u][v]==0){
20 vis[u][v]=1;
21 cnt++;
22 }
23 }
24 ans=max(cnt,ans);
25 }
26
27 void dfs(int a){
28 if(a==n+1){
29 check();
30 return ;
31 }
32 for(int i=1;i<=6;i++){
33 arr[a]=i;
34 dfs(a+1);
35 }
36 }
37 int main(){
38 memset(mp,0,sizeof(0));
39 memset(vis,0,sizeof(0));
40 cin>>n>>m;
41 for(int i=0;i<m;i++){
42 scanf("%d%d",&a,&b);
43 mp[i]={a,b};
44 }
45 dfs(1);
46 cout<<ans<<endl;
47 return 0;
48 }
另一种思路:
当n<7时有多少个边就有多少个dominoes,因为每个点与点之间都可以相连,并且不会使用同一个dominoes。当等于7时,必定有一个是重复的。
解析:https://blog.csdn.net/qq_38946354/article/details/101271185