codeforces#542 1130a----1130e

Posted pandaking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces#542 1130a----1130e相关的知识,希望对你有一定的参考价值。

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
");
21         else printf("1
");
22     }else printf("0
");
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
",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
");
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
",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
");
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的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #542 (Div. 2)

Codeforces 542D Superhero's Job 数论 哈希表 搜索

Codeforces Round #542 div1

CF542DSuperhero's Job 暴力

CF1130E Wrong Answer

Codeforces 452E Three strings 字符串 SAM