zoukankan      html  css  js  c++  java
  • 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
    ",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?'
    ':' ');
    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);
    19     for(int i=1;i<=n;++i) printf("%d%c",ans[i],i==n?'
    ':' ');
    20     return 0;
    21 }
    View Code
  • 相关阅读:
    丛铭俣 160809324 (作业5)
    丛铭俣 160809324 (作业4)
    丛铭俣 160809324 (作业3)
    丛铭俣 160809324 (作业2)
    系统设计的一些原则
    计算输入框的字符长度
    DateTime.ToLongDateString
    邮箱发送验证码
    .net core中加入日志
    .net core 将类库项目转移到一个新建的文件夹下面
  • 原文地址:https://www.cnblogs.com/csushl/p/10473484.html
Copyright © 2011-2022 走看看