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

codeforces #363(div.2)

时间:2016-07-24 20:47:44      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

A题 http://codeforces.com/problemset/problem/699/A

非常的水,两个相向而行,且间距最小的点,搜一遍就是答案了。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 struct node
 5 {
 6     int x;char ch;
 7 }s[200000+50];
 8 bool cmp(node& a,node& b)
 9 {
10     return a.x<b.x;
11 }
12 int main()
13 {
14     int n;
15     while(~scanf("%d",&n))
16     {
17         getchar();
18         for(int i=0;i<n;i++)
19             scanf("%c",&s[i].ch);
20         for(int i=0;i<n;i++)
21             scanf("%d",&s[i].x);
22         sort(s,s+n,cmp);
23         int ans = 0x3f3f3f3f;
24         for(int i=1;i<n;i++)
25         {
26             if(s[i].ch == L && s[i-1].ch == R)
27             {
28                 int dis= (s[i].x - s[i-1].x)/2;
29                 ans = min(ans,dis);
30             }
31         }
32         if(ans == 0x3f3f3f3f)
33             printf("-1\n");
34         else
35             printf("%d\n",ans);
36     }
37     return 0;
38 }

 

B题 http://codeforces.com/problemset/problem/699/B

讲道理 也是水题 然而我在实现的时候 实现不好这个问题 然而梦天2333 毕竟天神啪啪啪随便写写就A了。

这个代码是参考网上的思路搞的,关键是一个V数组和一个C数组记录,行和列的情况。

还有读入字符串的时候要小心的,因为它题目中默认的地图是从1开始的,如果直接scanf ma[i]这样读进来 就是每行都从0开始了,和题意不符

1 scanf("%s",ma[i]+1);//输入的一个小技巧

其实思路和它标程是一样的,就是没码出来。

 1 #include <cstdio>
 2 #include <cstring>
 3 #define mem0(x) memset(x,0,sizeof(x))
 4 char ma[1005][1005];
 5 int R[1000050],C[1000050];
 6 int tot,fi,fj,n,m;
 7 bool judge()
 8 {
 9     for(int i=1;i<=n;i++)
10     {
11         for(int j=1;j<=m;j++)
12         {
13             int cur = R[i] + C[j];
14             if(ma[i][j] == *) cur--;
15             if(tot == cur)
16             {
17                 fi = i, fj = j;
18                 return true;
19             }
20 
21         }
22     }
23     return false;
24 }
25 int main()
26 {
27     while(~scanf("%d%d",&n,&m))
28     {
29         mem0(R);
30         mem0(C);
31         for(int i=1;i<=n;i++)
32             scanf("%s",ma[i]+1);//输入的一个小技巧
33         tot = 0;
34         for(int i=1;i<=n;i++)
35             for(int j=1;j<=m;j++)
36                 if(ma[i][j] == *)
37                 {
38                     R[i] ++;
39                     C[j] ++;
40                     tot++;
41                 }
42         if(judge())
43             printf("YES\n%d %d\n",fi,fj);
44         else
45             printf("NO\n");
46     }
47     return 0;
48 }

 

C题 http://codeforces.com/problemset/problem/698/A

dp,小心一下 任何一种情况下都是能选择休息的。

 1 #include <cstdio>
 2 #include <map>
 3 #include <queue>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8 #define mem0(x) memset(x,0,sizeof(x))
 9 #define mem1(x) memset(x,-1,sizeof(x))
10 typedef long long LL;
11 const int INF = 0x3f3f3f3f;
12 
13 
14 int a;
15 int dp[105][3];
16 int main()
17 {
18     int n;
19     scanf("%d",&n);
20     for(int i=1;i<=n;i++)
21     {
22         scanf("%d",&a);
23         if(a == 0)
24         {
25             dp[i][0] = max(max(dp[i-1][0], dp[i-1][1]), dp[i-1][2]);
26         }
27         else if(a == 1)
28         {
29             dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);
30             dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + 1;
31         }
32         else if(a == 2)
33         {
34             dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);
35             dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + 1;
36         }
37         else
38         {
39             dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);
40             dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + 1;
41             dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + 1;
42         }
43     }
44     int maxn = 0;
45     for(int i=0;i<3;i++)
46         maxn = max(maxn, dp[n][i]);
47     printf("%d\n",n-maxn);
48     return 0;
49 }

 

D题 http://codeforces.com/problemset/problem/698/B

这题挺难想的当时。先思考整个问题,无非是由若干个环和若干棵树来组成了最初的图。

如果都是树,那么很好解决,选一棵树作为主树,其他的树根直接链接到主树的根上就解决问题了,修改次数应该是根结点的总数目-1。

如果都是环,那么,把某个环的某个结点接到自己身上,形成一棵树之后,其他的环直接接上来就好了。

如果是环和树都有,那么只要把环接到主树上就好了。

 

 1 #include <cstdio>
 2 #include <map>
 3 #include <queue>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8 #define mem0(x) memset(x,0,sizeof(x))
 9 #define mem1(x) memset(x,-1,sizeof(x))
10 typedef long long LL;
11 const int INF = 0x3f3f3f3f;
12 
13 int a[200005];
14 int pa[200005];
15 int uf_find(int x)
16 {
17     if(x==pa[x]) return x;
18     return pa[x] = uf_find(pa[x]);
19 }
20 
21 int main()
22 {
23     int n,cnt,root;
24     scanf("%d",&n);
25     //uf_init
26     for(int i=1;i<=n;i++) pa[i] = i ;
27 
28     cnt = 0, root = 0;
29     for(int i=1;i<=n;i++)
30     {
31         scanf("%d",&a[i]);
32         if(i == a[i])
33         {
34             cnt++,root = i;
35         }
36         else
37         {
38             int fx = uf_find(i);
39             int fy = uf_find(a[i]);
40             if(fx == fy)   a[i] = i,cnt++;//成环
41             else           pa[fx] = fy;
42         }
43     }
44     if(root == 0)
45     {
46         for(int i=1;i<=n;i++)
47         {
48             if(i == pa[i])
49             {
50                 root = i;
51                 break;
52             }
53         }
54         cnt++;
55     }
56     printf("%d\n",cnt-1);
57     for(int i=1;i<=n;i++)
58     {
59         if(i == a[i]) a[i] = root;//根只能有一个
60         printf("%d%c",a[i],i==n?\n: );
61     }
62     return 0;
63 }

 

codeforces #363(div.2)

标签:

原文地址:http://www.cnblogs.com/luosuo10/p/5701410.html

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