CF 1130A 1130B 1130C1129A1 1129A2 1129B(Round542A B C D1 D2 E)题解

A : Be Positive 题目地址:https://codeforces.com/problemset/problem/1130/A

题解:让你求是否满足一个d使得数列长为n的a数组的每个数除以d以后,所得数列正数的数量大于ceil(n);(除以后四舍五入,0不是正数)

注意d为负数的情况

参考代码:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int x=0,y=0;
 6     int t,a[105];
 7     cin>>t;
 8     for(int i=0;i<t;i++)
 9     {
10         scanf("%d",&a[i]);
11         if(a[i]>0) x++;
12         if(a[i]<0) y++;
13     }
14     
15     if(2*x>=t) cout<<1<<endl;
16     else if(y*2>=t) cout<<-1<<endl;
17     else cout<<0<<endl;
18     return 0;
19 } 
View Code

B : Two Cakes 题目地址: https://codeforces.com/problemset/problem/1130/B

题解:两个人依次走1,2,3...n这n个数的位置,求两个人所走步数和的最小值;

DP:dp[x]:表示走完第x个数的最小步数;

则  dp[i]=dp[i-1]+min(abs(vec[i][0]-vec[i-1][0])+abs(vec[i][1]-vec[i-1][1]),abs(vec[i][0]-vec[i-1][1])+abs(vec[i][1]-vec[i-1][0]));

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define clr(a,b) memset(a,b,sizeof(a))
 4 #define PI acos(-1.0)
 5 #define PII pair<int,int>
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 typedef long long ll;
10 const int INF=0x3f3f3f3f;
11 const int maxn=1e5+10;
12 int n,x;
13 ll dp[maxn];
14 vector<int> vec[maxn];
15 int main()
16 {
17     scanf("%d",&n);clr(dp,0);
18     for(int i=1;i<=2*n;++i)
19     {
20         scanf("%d",&x);
21         vec[x].push_back(i);
22     }
23     vec[0].push_back(1); vec[0].push_back(1);
24     for(int i=1;i<=n;++i)
25         dp[i]=dp[i-1]+min(abs(vec[i][0]-vec[i-1][0])+abs(vec[i][1]-vec[i-1][1]),abs(vec[i][0]-vec[i-1][1])+abs(vec[i][1]-vec[i-1][0]));
26     printf("%lld\n",dp[n]);
27     return 0;
28 }
View Code

C :  Connect 题目地址: https://codeforces.com/problemset/problem/1130/C

题解:给你一张n*n的地图,0代表陆地,1代表水地;只能走陆地;

给你起点和终点,并且你只能 打通一次 两块陆地;

让你求从起点大终点需要打通的陆地之间距离的最小值;

枚举起点所能到达的点,终点所能到达的点;暴力找最小值即可

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define clr(a,b) memset(a,b,sizeof(a))
 4 #define PI acos(-1.0)
 5 #define PII pair<int,int>
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 typedef long long ll;
10 const int INF=0x3f3f3f3f;
11 int ans=INF,n;
12 int x[2],y[2],v[2][55][55];
13 char z[55][55];
14 void dfs(int a,int b,int c)
15 {
16     if(v[c][a][b]) return ;
17     v[c][a][b]=1;
18     if(z[a+1][b]=='0') dfs(a+1,b,c);
19     if(z[a][b+1]=='0') dfs(a,b+1,c);
20     if(z[a-1][b]=='0') dfs(a-1,b,c);
21     if(z[a][b-1]=='0') dfs(a,b-1,c); 
22 }
23 int main()
24 {
25     cin>>n;
26     for(int i=0;i<2;i++) cin>>x[i]>>y[i];
27     for(int i=1;i<=n;i++) scanf("%s",z[i]+1);
28     for(int i=0;i<2;i++) dfs(x[i],y[i],i);
29     for(int i=1;i<=n;i++)
30         for(int j=1;j<=n;j++)
31         {
32             if(v[0][i][j])
33             {
34                 for(int k=1;k<=n;k++)
35                     for(int l=1;l<=n;l++)
36                     {
37                         if(v[1][k][l]) 
38                             ans=min(ans,(i-k)*(i-k)+(j-l)*(j-l)); 
39                     }
40             }
41         }
42     cout<<ans<<endl;
43     return 0;
44 }
View Code

D(D1 和 D2) :Toy Train 题目地址:  https://codeforces.com/problemset/problem/1129/A2

两题一样,只是数据不一样,放一起说

题解:

有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点。已知货车的容量足够大,可以同时装无数个糖果,但是每一次经过一个站的时候,只能够选择其中一项任务进行运输,假设从一个站到另一个站的运输时间为1,请问从1-n每个站点作为起点,最短的运输时间分别是多少

这个题目,由于我们每次跑都是绕圈的,所以,如果站点i有 out[i]项任务的话,至少要经过站点i,out[i]次,所以,我们可以得出一个公式,假设初始起点为s,运输终点为e
dist(s,i)+n∗out[i]+dist(i,e) dist(s,i)+n*out[i]+dist(i,e)dist(s,i)+n∗out[i]+dist(i,e) 就是完成第i个站点的所有任务的时间,因此,我们只要让dist(i,e) dist(i,e)dist(i,e)最小即可

D1  D2   参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define clr(a,v) memset(a,v,sizeof(a))
 4 #define PI acos(-1.0)
 5 #define PII pair<int,int>
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 typedef long long ll;
10 const int INF=0x3f3f3f3f;
11 const int maxn=5010;
12 int n,m,x,y;
13 int Min[maxn],out[maxn];
14 int dis(int i,int j){return j>=i? j-i:j-i+n;}
15 int main()
16 {
17     scanf("%d%d",&n,&m);
18     clr(out,0);clr(Min,INF);
19     for(int i=1;i<=m;++i)
20     {
21         scanf("%d%d",&x,&y);
22         if(y>=x) Min[x]=min(Min[x],y-x);
23         else if(y<x) Min[x]=min(Min[x],y-x+n);
24         out[x]++;
25     }
26     
27     for(int i=1;i<=n;++i)
28     {
29         int ans=0;
30         for(int j=1;j<=n;++j)
31         {
32             if(out[j]) ans=max(ans,dis(i,j)+Min[j]+(out[j]-1)*n);
33         }
34         printf("%d%c",ans,i==n?'\n':' ');
35     }
36     return 0;
37 }
View Code

E : Wrong Answer 题目地址: https://codeforces.com/problemset/problem/1129/B

题解:

注意到 n2n≥2 时才可能有解,可以按如下方式构造一个 a1,2na1,2…n:

令 a1=1a1=−1 ,而后面的数都为正.记 s=ni=2ais=∑i=2nai,显然题目中的程序给出的答案是 s(n1)s∗(n−1) .

为使这个答案比正确答案少 kk ,那么正确答案只能是 (s1)n(s−1)∗n.

s(n1)+k=(s1)ns=k+ns(n−1)+k=(s−1)ns=k+n

 由于我们可以放 11 个 1−1 , 19991999 个 106106,此时 sn=19991062000>109s−n=1999∗106−2000>109 ,所以按照上述方法一定可以构造出一组解.

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define mp make_pair
 5 #define pii pair<int,int>
 6 const int delta=1e6-1;
 7 int ans[2019],n=0,k;
 8 int main()
 9 {
10     scanf("%d",&k);
11     ++k; ans[++n]=-1;
12     while(k>=delta)
13     {
14         k-=delta;
15         ans[++n]=delta+1;
16     }
17     ans[++n]=k+1;
18     printf("%d\n",n);
19     for(int i=1;i<=n;++i) printf("%d%c",ans[i],i==n?'\n':' ');
20     return 0;
21 }
View Code

 

posted @ 2019-03-04 21:49  StarHai  阅读(378)  评论(0编辑  收藏  举报