C. Anadi and Domino

 

C. Anadi and Domino

 

题目链接:http://codeforces.com/contest/1230/problem/C

time limit per test:
2 seconds
memory limit per test:
256 megabytes
input:
standard input
output:
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

posted @ 2019-09-24 22:34  yya雨  阅读(415)  评论(0编辑  收藏  举报