题目链接:http://codeforces.com/contest/1230/problem/C
C. Anadi and Domino
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