码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #292 (Div. 2)

时间:2015-02-20 14:05:36      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

A .Drazil and Date

题目大意:问是否有一条路径,从(0,0)到(x,y)正好走s步的路线存在,每步可以上下左右移动一格

思路:显然先计算出(0,0)到(x,y)的最短距离后,看剩下的步数是否是偶数就可以了,注意x,y为负数的情况

技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int mabs(int x)
 5 {
 6     if(x>0)return x;else return -x;
 7 }
 8 int main()
 9 {
10     int n,m,step;
11     scanf("%d%d%d",&n,&m,&step);
12     int u=mabs(n)+mabs(m);
13     if(u>step)printf("No\n");
14     else if((step-u)&1)printf("No\n");
15     else printf("Yes\n");
16     return 0;
17 }
View Code

B. Drazil and His Happy Friends

题目大意:n个男生从0编号到n-1,m个女生编号从0到m-1,男女中有些快乐有些不快乐,每次邀请编号为i mod n的男生和i mod m编号的女生,只要有一个快乐,两个人就都快乐了,问是否有可能让所有人都快乐?

思路:感觉使劲想应该有数学公式可以推的,懒了那么一下下于是一个大模拟搞定

技术分享
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #define maxn 1000
 5 using namespace std;
 6 int boy[maxn],girl[maxn],b,g,x;
 7 int main()
 8 {
 9     int n,m;
10     scanf("%d%d",&n,&m);
11     scanf("%d",&b);
12     for(int i=1;i<=b;i++)
13     {
14         scanf("%d",&x);
15         boy[x]=1;
16     }
17     scanf("%d",&g);
18     for(int i=1;i<=g;i++)
19     {
20         scanf("%d",&x);
21         girl[x]=1;
22     }
23     int max_=max(n,m);
24     for(int i=0;i<max_*100;i++)
25     {
26         girl[i%m]=boy[i%n]=girl[i%m]|boy[i%n];
27     }
28     for(int i=0;i<n;i++)
29     {
30         if(boy[i]==0){printf("No\n");return 0;}
31         //printf("%d ",boy[i]);
32     }
33     for(int i=0;i<m;i++)if(girl[i]==0){printf("No\n");return 0;}
34     printf("Yes\n");
35     return 0;
36 }
View Code

C. Drazil and Factorial

题目大意:给出函数F(x)为x的十进制下各位数阶乘的乘积,求最大的y使得F(x)=F(y)并且y中不含有0和1

思路:应该挺容易想的,首先素数显然只能放在那儿不能动,合数的话尽量拆成较多的数,比如9!可以拆成7!*3!*3!*2!一次类推,总共就2到9一共8个数,除去素数就只要手推几个数这题就出来了

技术分享
 1 #include<cstdio>
 2 using namespace std;
 3 char ch[1000];
 4 int cnt[100];
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     scanf("%s",ch+1);
10     for(int i=1;i<=n;i++)
11     {
12         int u=ch[i]-0;
13         if(u<=1)continue;
14         else if(u==4)
15         {
16             cnt[2]+=2;
17             cnt[3]++;
18         }
19         else if(u==6)
20         {
21             cnt[3]++;
22             cnt[5]++;
23         }
24         else if(u==8)
25         {
26             cnt[7]++;
27             cnt[2]+=3;
28         }
29         else if(u==9)
30         {
31             cnt[2]++;
32             cnt[3]+=2;
33             cnt[7]++;
34         }
35         else
36         {
37             cnt[u]++;
38         }
39     }
40     for(int i=9;i>=2;i--)
41     {
42         for(int j=1;j<=cnt[i];j++)printf("%d",i);
43     }
44     printf("\n");
45     return 0;
46 }
View Code
D. Drazil and Tiles
题目大意:给一个n*m的棋盘,放1*2的骨牌,棋盘上有些位置不能放骨牌,问能否覆盖满整个棋盘并且覆盖方案数唯一
思路:本质上是二分图最大匹配是否唯一的问题(黑白染色建图,每个匹配对应着唯一的放骨牌的数,最大匹配对应着放满的情况)
实际不用那么复杂,只要看是否存在一个点三头不能放,唯有一头能放的结构,然后每次在这种结构中放骨牌即可
技术分享
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<queue>
  5 #define maxn 4000
  6 using namespace std;
  7 const int dx[10]={0,1,-1,0,0};//down up rig,lef
  8 const int dy[10]={0,0,0,1,-1};
  9 int map[maxn][maxn];
 10 queue<pair<int , int > > q;
 11 char ch[maxn];
 12 //can 1
 13 int check(int x,int y)
 14 {
 15     for(int i=1;i<=4;i++)if(map[x+dx[i]][y+dy[i]]==1)
 16     {
 17         int flag=0;
 18         for(int j=1;j<=4;j++)if(j!=i)
 19         {
 20             if(map[x+dx[j]][y+dy[j]]==1){flag=1;break;}
 21         }
 22         if(flag==0)return i;
 23     }
 24     return 0;
 25 }
 26 int main()
 27 {
 28     int n,m;
 29     scanf("%d%d",&n,&m);
 30     for(int i=1;i<=n;i++)
 31     {
 32         scanf("%s",ch+1);
 33         for(int j=1;j<=m;j++)
 34         {
 35             if(ch[j]==.)map[i][j]=1;else map[i][j] = 0;
 36         }
 37     }
 38     for(int i=1;i<=n;i++)
 39     {
 40         for(int j=1;j<=m;j++)
 41         {
 42             int u;
 43             if(u=check(i,j) && map[i][j]==1)q.push(make_pair(i,j));
 44         }
 45     }
 46     while(!q.empty())
 47     {
 48         pair<int,int> temp=q.front();
 49         q.pop();
 50         int x=temp.first,y=temp.second;
 51         int u=check(x,y);
 52         if(u==0)continue;
 53         if(u==1)
 54         {
 55             map[x][y]=^;
 56             map[x+1][y]=v;x++;
 57         }
 58         if(u==2)
 59         {
 60             map[x][y]=v;
 61             map[x-1][y]=^;x--;
 62         }
 63         if(u==3)
 64         {
 65             map[x][y]=<;
 66             map[x][y+1]=>;y++;
 67         }
 68         if(u==4)
 69         {
 70             map[x][y]=>;
 71             map[x][y-1]=<;y--;
 72         }
 73         for(int i=1;i<=4;i++)
 74         {
 75             int xx=temp.first+dx[i],yy=temp.second+dy[i];
 76             if(map[xx][yy]==1 && check(xx,yy))q.push(make_pair(xx,yy));
 77         }
 78         for(int i=1;i<=4;i++)
 79         {
 80 
 81             int xx=x+dx[i],yy=y+dy[i];
 82             if(map[xx][yy]==1 && check(xx,yy))q.push(make_pair(xx,yy));
 83         }
 84     }
 85     for(int i=1;i<=n;i++)
 86     {
 87         for(int j=1;j<=m;j++)
 88         {
 89             if(map[i][j]==1)
 90             {
 91                 printf("Not unique\n");
 92                 return 0;
 93             }
 94         }
 95     }
 96     for(int i=1;i<=n;i++)
 97     {
 98         for(int j=1;j<=m;j++)
 99         {
100             if(map[i][j]==0)
101             {
102                 printf("*");
103             }
104             else printf("%c",map[i][j]);
105         }
106         printf("\n");
107     }
108     return 0;
109 }
View Code

 

 
 
 

Codeforces Round #292 (Div. 2)

标签:

原文地址:http://www.cnblogs.com/philippica/p/4296487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!