zoukankan      html  css  js  c++  java
  • Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2)

    A. Be Positive 

    题意:给出一个数组 每个树去除以d(d!=0)使得数组中大于0的数 大于ceil(n/2) 求任意d

    思路:数据小 直接暴力就完事了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=500;
     4 double a[maxn];
     5 int main(){
     6     int n;
     7     scanf("%d",&n);
     8     for(int i=0;i<n;i++){
     9         scanf("%lf",&a[i]);
    10     }
    11     int temp=ceil(n*1.0/2);
    12     for(int i=-1e3;i<=1e3;i++){
    13         if(i==0)continue;
    14         int flag=0;
    15         for(int j=0;j<n;j++){
    16             if(a[j]/i>0){
    17                 flag++;
    18                 
    19             }
    20         }
    21         if(flag>=temp){
    22             printf("%d
    ",i);
    23             return 0;
    24         }
    25     }
    26     printf("0
    ");
    27     return 0;
    28 }
    View Code

    B. Two Cakes

    题意:给出一个1-n的数组 每个数字都出现两编  两个人 每个人从1--n开始按大小选择数字(代价为数组上走多远距离)  每个数字只能选择一次  问最少要走多久

    思路:把每个数的位置记一下 然后直接算上一个位置到下一个位置的最小和是多少 例如 要算2 的 直接算2个1分别到两个2的两种情况即可,因为这是无后效性的

    枚举到哪个数字 当前时刻两个人肯定在上一个位置 例如要到n时两个人肯定在n-1出发

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=500;
     4 double a[maxn];
     5 int main(){
     6     int n;
     7     scanf("%d",&n);
     8     for(int i=0;i<n;i++){
     9         scanf("%lf",&a[i]);
    10     }
    11     int temp=ceil(n*1.0/2);
    12     for(int i=-1e3;i<=1e3;i++){
    13         if(i==0)continue;
    14         int flag=0;
    15         for(int j=0;j<n;j++){
    16             if(a[j]/i>0){
    17                 flag++;
    18                 
    19             }
    20         }
    21         if(flag>=temp){
    22             printf("%d
    ",i);
    23             return 0;
    24         }
    25     }
    26     printf("0
    ");
    27     return 0;
    28 }
    View Code

    C. Connect

    题意:给出一张图 可以在不同连通快之间做通道 但是会消耗 算术距离的代价 问最小代价是多少

    思路: 图很小 只有50*50 所以直接把起点和终点的连通的快的坐标记下来 然后暴力求最小代价即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=60;
     4 int  n;
     5 char mp[maxn][maxn];
     6 int vis[maxn][maxn];
     7 struct Node{
     8     int x,y;
     9 }s1[maxn*maxn],s2[maxn*maxn];
    10 int dy[]={
    11     1,-1,0,0
    12 };
    13 int dx[]={
    14     0,0,-1,1
    15 };
    16 void dfs(int x,int y,int num){
    17     vis[x][y]=num;
    18     for(int i=0;i<4;i++){
    19         int tx=x+dx[i],ty=y+dy[i];
    20         if(tx<1||tx>n||ty<1||ty>n)continue;
    21         if(vis[tx][ty]!=0||mp[tx][ty]=='1')continue;
    22         dfs(tx,ty,num);
    23     }
    24 }
    25 
    26 int dist(int x1,int y1,int x2,int y2){
    27     return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    28 }
    29 int main(){
    30      
    31     scanf("%d",&n);
    32     int sx,sy,tx,ty;
    33     scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
    34     for(int i=1;i<=n;i++){
    35         scanf("%s",mp[i]+1);
    36     }
    37     
    38     int temp=1;
    39     memset(vis,0,sizeof(vis));
    40     for(int i=1;i<=n;i++){
    41         for(int j=1;j<=n;j++){
    42             if(vis[i][j]==0&&mp[i][j]=='0'){dfs(i,j,temp);temp++;}
    43         }
    44     }
    45     if(vis[sx][sy]==vis[tx][ty]){
    46         printf("0
    ");
    47         return 0;
    48     }
    49     int num1=0,num2=0;
    50         for(int i=1;i<=n;i++){
    51         for(int j=1;j<=n;j++){
    52             if(vis[i][j]==vis[sx][sy]){
    53                 s1[num1].x=i,s1[num1++].y=j;
    54             }
    55             if(vis[i][j]==vis[tx][ty]){
    56                     s2[num2].x=i,s2[num2++].y=j;
    57             }
    58         }
    59     }
    60         int ans=maxn*maxn*2;
    61         for(int i=0;i<num1;i++){
    62             for(int j=0;j<num2;j++)
    63             {
    64                 ans=min(ans,dist(s1[i].x,s1[i].y,s2[j].x,s2[j].y));
    65             }
    66         }
    67         cout<<ans<<endl;
    68     return 0;
    69 }
    View Code

    D2. Toy Train

    题意:一个1-n的圈 火车在这个圈上顺时针旋转 每个点有 任务:把该点的糖果送到 另外一个点去    在一个点上只能往上装一个糖果,但是可以卸下任意个 

    问从每个点出发 所需要的最短时间    直接把每个点从1号出发所需要的最长时间预处理一下 然后从1号点枚举 这样每个点的时间就是 最长时间减去  枚举到的起点和1之间的距离

    思路: 对于一个点x假设有k个任务  那么 当前点最少需要走 完整圈(k-1)圈 然后走剩下的那个点 

    time=  (k-1) *n +  dist(start,x) +dist(x,最后一个要送的点)

    所以起点选择和x点相同 最后一个点在顺时针方向上离x点最近 可以得到最小时间

    暴力每个点即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=20000+5;
     4 int len[maxn],b[maxn],ans[maxn];
     5 vector<int>a[maxn];
     6 multiset<int>s;
     7 int main(){
     8     int n,m;
     9     scanf("%d%d",&n,&m);
    10     int x,y;
    11     for(int i=0;i<m;i++){
    12         scanf("%d%d",&x,&y);
    13         if(x>y)y+=n;
    14         a[x].push_back(y);
    15     }
    16     for(int i=1;i<=n;i++){
    17         if(a[i].size()==0)len[i]=0;
    18         else {
    19             sort(a[i].begin(),a[i].end());
    20             len[i]=a[i][0]+(a[i].size()-1)*n;
    21         }
    22         s.insert(len[i]);
    23     }
    24     for(int i=1;i<=n;i++){
    25         ans[i]=*(--s.end())-i;
    26         if(len[i]!=0){
    27             s.erase(s.find(len[i]));
    28         s.insert(len[i]+n);
    29         }
    30     }
    31     for(int i=1;i<=n;i++)printf("%d ",ans[i]);
    32 
    33     return 0;
    34 }
    View Code
  • 相关阅读:
    FreeTextbox 中吃掉Server路径的问题
    .net 中发mail到hotmail中乱码问题的解决
    管理的技巧和沟通
    将近一个星期都没来园子里面了
    园子里面西安的朋友请进来
    又开始乱了
    google真是个小人
    周末的晴天
    pm2入门
    strlen与sizeof区别 冷夜
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10695729.html
Copyright © 2011-2022 走看看