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

codeforces#542 1130a----1130e

时间:2019-02-25 16:49:51      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:eee   pen   bcb   gif   com   很多   www.   include   clu   

a:取特殊值为1即可

技术图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int n;
 7 int num[110];
 8 int main(){
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++) scanf("%d",&num[i]);
11     sort(num+1,num+n+1);
12     int s1=0,s2=0,s3=0;
13     for(int i=1;i<=n;i++){
14         if(num[i]<0) s1++;
15         if(num[i]==0) s2++;
16         if(num[i]>0) s3++;
17     }
18     int len=(n+1)/2;
19     if(s1>=len||s3>=len){
20         if(s1>=len) printf("-1\n");
21         else printf("1\n");
22     }else printf("0\n");
23     return 0;
24 }
View Code

b:首先肯定是按大小排个序即可,然后每次只有可能两种情况,变化一下即可

技术图片
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <bitset>
 6 using namespace std;
 7 const int maxn=100100;
 8 typedef long long ll;
 9 int n;
10 struct node{
11     int tip,x;
12 };
13 node sum[maxn*2];
14 
15 bool cmp(node n1,node n2){
16     if(n1.tip==n2.tip) return n1.x<n2.x;
17     else return n1.tip<n2.tip;
18 }
19 
20 int main(){
21     scanf("%d",&n);
22     int m=2*n;
23     ll ans=0;
24     for(int i=1;i<=m;i++){
25         scanf("%d",&sum[i].tip);
26         sum[i].x=i;
27     }
28     sort(sum+1,sum+m+1,cmp);
29     int s1=1,s2=1;
30     for(int i=1;i<=n;i++){
31         ans=(ans+min(abs(sum[2*i-1].x-s1)+abs(sum[2*i].x-s2),abs(sum[2*i-1].x-s2)+abs(sum[2*i].x-s1)));
32         s1=sum[2*i-1].x;
33         s2=sum[2*i].x;
34     }
35     printf("%lld\n",ans);
36     return 0;
37 }
View Code

c:一道稍微变形了一点点的联通块问题,首先先从起点dfs一遍,判一点能不能到终点,到了就输出0,不能的话把终点的联通块也遍历一遍,因为n只有50,取个最小值即可。

技术图片
 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <queue>
 7 using namespace std;
 8 char sz[55][55];
 9 int vis[55][55];
10 int n;
11 int sx,sy,ex,ey;
12 struct node{
13     int x,y;
14 };
15 int divs[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
16 int dian[3][2550][3];
17 int  tot1=0,tot2=0;
18 
19 void bfs(int x1,int y1,int t){
20     queue<node >que;
21     int len=0;
22     while(!que.empty()) que.pop();
23     node now,next;
24     now.x=x1;now.y=y1;vis[x1][y1]=1;
25     len++;
26     dian[t][len][1]=x1;dian[t][len][2]=y1;
27     que.push(now);
28     while(!que.empty()){
29         now=que.front();que.pop();
30         for(int k=0;k<4;k++){
31             int x11=now.x+divs[k][0];
32             int y11=now.y+divs[k][1];
33             if(x11<1||x11>n) continue;
34             if(y11<1||y11>n) continue;
35             if(vis[x11][y11]==1) continue;
36             if(sz[x11][y11]==1) continue;
37             next.x=x11;next.y=y11;
38             que.push(next);
39             vis[x11][y11]=1;
40             len++;
41             dian[t][len][1]=x11;dian[t][len][2]=y11;
42         }
43     }
44     if(t==1) tot1=len;
45     else tot2=len;
46 }
47 
48 int main(){
49     scanf("%d",&n);
50     scanf("%d%d",&sx,&sy);
51     scanf("%d%d",&ex,&ey);
52     for(int i=1;i<=n;i++) scanf("%s",sz[i]+1);
53     bfs(sx,sy,1);
54     if(vis[ex][ey]==1){
55         printf("0\n");
56     }else{
57         bfs(ex,ey,2);
58         int ans=1000000;
59         for(int i=1;i<=tot1;i++){
60             for(int j=1;j<=tot2;j++){
61                 int ss=dian[1][i][1]-dian[2][j][1];
62                 int yy=dian[1][i][2]-dian[2][j][2];
63                 ans=min(ans,ss*ss+yy*yy);
64             }
65         }
66         printf("%d\n",ans);
67     }
68     return 0;
69 }
View Code

d:这道题其实还是挺好想的,首先第一个循环是每个点出发,  对每个运输的起点的总运输和最小值当中取一个最大值那么肯定就是运输的总时间,思路还是挺好捋顺的,

   但是我却写了很多行,关键是没确定一点,是怎么简化转圈圈的步骤,其实,我只要先算起点到运输起点,然后在跑圈圈,最后算一下最小距离即可

   感觉这只是一道普通的贪心啊,根本没有d的难度

  下面是代码:

技术图片
 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <bitset>
 6 #include <cstdio>
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn=5500;
10 int n,m;
11 struct node{
12     int x,y;
13 };
14 node sum[maxn*5];
15 
16 int dis(int x,int y){
17     if(x<=y) return abs(y-x);
18     else return abs(n-x)+y;
19 }
20 
21 bool cmp(node n1,node n2){
22     if(n1.x==n2.x) return dis(n1.x,n1.y)>dis(n2.x,n2.y);
23     else return n1.x<n2.x;
24 }
25 
26 int main(){
27     scanf("%d%d",&n,&m);
28     for(int i=1;i<=m;i++) scanf("%d%d",&sum[i].x,&sum[i].y);
29     sort(sum+1,sum+m+1,cmp);
30     for(int i=1;i<=n;i++){
31         int ans=0,t=0;
32         for(int j=1;j<=m;j++){
33             t=j;
34             while(t<m&&sum[t+1].x==sum[j].x) t++;
35             ans=max(ans,dis(i,sum[t].x)+dis(sum[t].x,sum[t].y)+(t-j)*n);
36             j=t;
37         }
38         printf("%d ",ans);
39     }
40     return 0;
41 }
View Code

e:考虑构造一个长度为n=2000的序列,前1998项都是0,第1999项是负数,第2000项是正数。设1999项绝对值为y,2000项绝对值为x,则要求n*(x-y)-k=x,也即(n-1)x=k+ny。注意到n和n-1互质,所以y取遍0~n-1后一定能找到一个整数x,其作为答案即可。(这是借助一个大佬的构造方法:https://www.cnblogs.com/Gloid/p/10428941.html)

 下面是代码:

技术图片
 1 /*
 2  2000*(x-y)- n = x;
 3  1999*x = n + 2000*y;
 4  */
 5 #include <algorithm>
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <iostream>
 9 #include <cmath>
10 #include <bitset>
11 using namespace std;
12 int n;
13 int main(){
14     scanf("%d",&n);
15     for(int i=0;i<1000000;i++){
16         if((n+2000*i)%1999==0){
17             printf("2000\n");
18             for(int j=1;j<=1998;j++) printf("0 ");
19             printf("%d %d",0-i,(n+2000*i)/1999);
20             return 0;
21         }
22     }
23     return 0;
24 }
View Code

 

codeforces#542 1130a----1130e

标签:eee   pen   bcb   gif   com   很多   www.   include   clu   

原文地址:https://www.cnblogs.com/pandaking/p/10431491.html

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