zoukankan      html  css  js  c++  java
  • 第二次训练 密码acmore

    网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#overview

    贪心全场!!!!

    A题:

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef struct node
    {
        double x1;
        double x2;
    
    }point;
    point position[1010];
    bool cmp(point a,point b)
    {
        return a.x1<b.x1;
    }
    int main()
    {
        int n,d;
        int i;
        int tempx,tempy;
        int ans;
        double temp;
        int flage;
        int CASE=1;
    
    
        while(~scanf("%d%d",&n,&d))
        {
            if(n==0&&d==0)break;
    
            flage=0;
            for(i=1;i<=n;i++)
            {
                scanf("%d %d",&tempx,&tempy);
                if(tempy>d){ flage=1;}//此处不可以加break
                else if(flage==0)
                {
                position[i].x1=tempx-sqrt(double(d*d-tempy*tempy));
                position[i].x2=tempx+sqrt(double(d*d-tempy*tempy));
                }
            }
    
            printf("Case %d: ",CASE++);
    
            if(!flage)
           {
            sort(position+1,position+1+n,cmp);
            temp=position[1].x2;
            ans=1;
            for(i=2;i<=n;i++)
            {
                if(position[i].x1-temp>10e-7)
                {
                    ans++;
                    temp=position[i].x2;
    
                }
                else
                {
                    temp=temp<position[i].x2?temp:position[i].x2;
                }
            }
            printf("%d
    ",ans);
           }
           if(flage)
           printf("-1
    ");
        }
       return 0;
    }     //网上找的代码.....能AC,0MS。

    我自己写的。。。。真心不知道哪错了,一直WA。

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<math.h>
     4 using namespace std;
     5 class A
     6 {
     7 public:
     8     int a;
     9     int b;
    10 }z[1005];
    11 int dis(int y,int d)
    12 {
    13     return sqrt(d*d-y*y);
    14 }
    15 int main()
    16 {
    17     int n,i,x[1005],y[1005],zhong,sum=0,j,k,t,d,q;
    18     while(~scanf("%d%d",&n,&d))
    19     {
    20         if(n==0&&d==0)
    21             break;
    22         sum++;
    23         zhong =0;
    24         for(i=0;i<n;i++)
    25         {
    26             scanf("%d%d",&x[i],&y[i]);
    27             if(y[i]>d)
    28                 zhong=1;
    29         }
    30         if(zhong==1)
    31             cout<<"Case "<<sum<<": "<<"-1"<<endl;
    32         else if(zhong ==0)
    33         {
    34             if(n==1)
    35                 cout<<"Case "<<sum<<": "<<"1"<<endl;
    36             else
    37             {
    38                for(i=0;i<n;i++)
    39                {
    40                    t=dis(y[i],d);
    41                    z[i].a=x[i]-t;
    42                    z[i].b=x[i]+t;
    43                }
    44                 for(i=0;i<n-1;i++)
    45                     for(j=i+1;j<n;j++)
    46                     {
    47                         if(z[i].a>z[j].a)
    48                         {
    49                             t=z[i].a;
    50                             z[i].a=z[j].a;
    51                             z[j].a=t;
    52                             t=z[i].b;
    53                             z[i].b=z[j].b;
    54                             z[j].b=t;
    55                         }
    56                     }
    57                     k=1;
    58                      q=z[0].b;
    59                     for(j=1;j<n;j++)
    60                     {
    61                         if(q<z[j].a)
    62                         {
    63                             k++;
    64                             q=z[j].b;
    65                         }
    66                         else
    67                             q=q<z[j].b?q:z[j].b;
    68                     }
    69 
    70                 cout<<"Case "<<sum<<": "<<k<<endl;
    71             }
    72         }
    73     }
    74     return 0;
    75 }         //求大神指点......

    知道哪错了。。。。精度问题!!!!!!雷达可以不在整数坐标上!!!!!!!

    接下来是改过的,能AC的代码:47MS

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    using namespace std;
    class A
    {
    public:
        double a;    //double !!!
    double b; }z[1005]; double dis(double y,double d) //注意用double !!!!!
    {
    return sqrt(d*d-y*y); } int main() { int n,i,zhong,sum=0,j,k; double d,x[1005],y[1005],q,t; while(~scanf("%d%lf",&n,&d)) { if(n==0&&d==0) break; sum++; zhong =0; for(i=0;i<n;i++) { scanf("%lf%lf",&x[i],&y[i]); if(y[i]>d) zhong=1; } if(zhong==1) cout<<"Case "<<sum<<": "<<"-1"<<endl; else if(zhong ==0) { if(n==1) cout<<"Case "<<sum<<": "<<"1"<<endl; else { for(i=0;i<n;i++) { t=dis(y[i],d); z[i].a=x[i]-t; z[i].b=x[i]+t; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { if(z[i].a>z[j].a) { t=z[i].a; z[i].a=z[j].a; z[j].a=t; t=z[i].b; z[i].b=z[j].b; z[j].b=t; } } k=1; q=z[0].b; for(j=1;j<n;j++) { if(q<z[j].a) { k++; q=z[j].b; } else q=q<z[j].b?q:z[j].b; } cout<<"Case "<<sum<<": "<<k<<endl; } } } return 0; }

    再就是坑爹的B题,大意是,给出指数和最后的值,求底数.

    颤抖吧!!!!!16MS

    #include<iostream>
    #include<math.h>
    using namespace std;
    int main()
    {
        double s,n;
        while(cin>>n>>s)
          cout<<pow(s,1/n)<<endl;;
        return 0;
    }

    深深的觉得Orz......
    C题理解好题意即可。

    以下题意解释来自:優YoU http://user.qzone.qq.com/289065406/blog/1299234147

    题意比较难懂,其实只要读懂题意,就很简单了。

    大意是一个公司在12个月中,或固定盈余s,或固定亏损d.

    但记不得哪些月盈余,哪些月亏损,只能记得连续5个月的代数和总是亏损(<0为亏损),而一年中只有8个连续的5个月,分别为1~5,2~6,…,8~12

    问全年是否可能盈利?若可能,输出可能最大盈利金额,否则输出“Deficit".

    根据经验,贪心选择往往都在极端处(临界点)选择。(其实这题不用贪心,单纯枚举也可以AC,因为不同情况实在太少呐。。。。

    不难证明,每连续5个月中,在保证这5个月经营之和为亏损的情况下,亏损的月数肯定应尽量往后选,盈利的月数应尽量往前选。证明省略。

    先处理处理完1~5月后,剩下的月份可以根据“连续5个月经营之和为亏损”这个条件进行确定亏损还是盈利。

    本题的贪心选择每次仅仅选取其中一种情况(1~5月),因为之后月份无需再选择,所以每次总共只做了一次贪心选择。

    实际上;只要讨论5种情况即可;(任一月固定盈余s,或固定亏损d).

    SSSSDSSSSDSS   4s<d       保证“连续5个月必亏损”,每连续5个月种至少1个月D,

                              保证可能有全年最大盈余,每连续5个月中至多4个月S

    SSSDDSSSDDSS   3s<2d      保证“连续5个月必亏损”,每连续5个月种至少2个月D,

    保证可能有全年最大盈余,每连续5个月中至多3个月S

    SSDDDSSDDDSS   2s<3d      保证“连续5个月必亏损”,每连续5个月种至少3个月D,

    保证可能有全年最大盈余,每连续5个月中至多2个月S

    SDDDDSDDDDSD   s<4d       保证“连续5个月必亏损”,每连续5个月种至少4个月D,

    保证可能有全年最大盈余,每连续5个月中至多1个月S

    DDDDDDDDDDDD   s>=4d      保证“连续5个月必亏损”,每连续5个月种至少5个月D,

    每月亏损,此情况全年必亏损

    要注意的是,前4种情况都仅仅是“可能有全年的盈余”,而不是“一定有全年的盈余”。

    但是若果一旦有盈余,必定是最大盈余

    把5种情况可以归纳为关于s的判定条件:

    0 <= s <1/4d           每连续5个月种至少1个月D

    1/4d <= s < 2/3d          每连续5个月种至少2个月D

    2/3d <= s < 3/2d          每连续5个月种至少3个月D

    3/2d <= s < 4d           每连续5个月种至少4个月D

    4d <= s                全年各月必亏损

    代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        int sum;
        double s,d;
        while(~scanf("%lf%lf",&s,&d))
        {
            sum=0;
            if(s>=0&&s*4<d)
                sum=10*s-d*2;
            else if(s*4>=d&&s*3<d*2)
                sum=8*s-4*d;
            else if(s*3>=d*2&&s*2<d*3)
                sum=6*s-6*d;
            else if(s*2>=3*d&&s<4*d)
                sum=3*s-9*d;
            if(s>=4*d || sum<0)
                cout<<"Deficit"<<endl;
            else
                cout<<sum<<endl;
            }
        return 0;
    }

    D题:    来自一学姐,感觉不错~

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include <iostream>
     4 using namespace std;
     5 const int maxn=100000+10;
     6 struct Line
     7 {
     8 int s;
     9 int t;
    10 }line[maxn],temp[maxn];
    11 bool cmp(Line a,Line b)
    12 {
    13     return a.s<b.s||(a.s==b.s&&a.t>b.t);
    14 }
    15 int main()
    16 {
    17     int m,k,i,j,ans;
    18     int n,cnt,l,r;
    19     scanf("%d",&m);
    20      cnt=0;
    21         for(;;)
    22         {
    23             scanf("%d%d",&l,&r);
    24             if(l==0&&r==0)
    25             break;
    26                 line[++cnt].s=l;
    27                 line[cnt].t=r;
    28 
    29         }
    30 
    31         sort(line+1,line+cnt+1,cmp);
    32         j=1;
    33         for(i=2;i<=cnt;i++)//将互不覆盖的线段存起来
    34         if(line[i].s>line[j].s&&line[i].t>line[j].t)
    35          line[++j]=line[i];
    36          n=j;
    37          ans=0;
    38          line[n+1].s=m+1;
    39          line[n+1].t=m+1;
    40          k=0;//第一个临界
    41          for(i=1;i<=n;i++)
    42          if(line[i+1].s>k&&line[i].s<=k)
    43          {
    44              k=line[i].t;
    45              temp[++ans]=line[i];
    46              if(line[i].t>=m)
    47              {
    48                  printf("%d
    ",ans);
    49                  for(j=1;j<=ans;j++)
    50                   printf("%d %d
    ",temp[j].s,temp[j].t);
    51                   return 0;
    52              }
    53          }
    54          printf("No solution
    ");
    55     return 0;
    56 }
    View Code

    E题:  先是要读懂题:

      以下解释来自:http://blog.sina.com.cn/s/blog_4dc813b20100t133.html

    将整个题归结为一棵树,求最多能给多少个节点染色,根节点不染色,且染色规则如下:
    (1)每一个节点至多只有一个儿子被染色
    (2)如果某个节点被染色,那么它的所有儿子都不能染色。

    再就是代码,不过要先去看看vector(向量容器):http://s.acmore.net/show_article/show/41

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 #include<cstring>
     5 using namespace std;
     6 #define N 500001
     7 struct node{
     8     int depth;
     9     int i;
    10 }order[N];
    11 int parent[N];
    12 int n;
    13 bool mark[N];
    14 vector<int> result;//vector(向量容器) 网站:http://s.acmore.net/show_article/show/41
    15 bool cmp(const node a,const node b)
    16 {
    17     return a.depth>b.depth;
    18 }
    19 int main()
    20 {
    21     int i;
    22     order[1].depth=0;
    23     order[1].i=1;
    24     while(cin>>n)
    25     {
    26         for(i=2;i<=n;i++)
    27         {
    28             cin>>parent[i];
    29             order[i].depth=order[parent[i]].depth+1;
    30             order[i].i=i;
    31         }
    32         sort(order+2,order+n+1,cmp);
    33         result.clear();
    34         memset(mark,0,sizeof(mark));
    35         for(i=2;i<=n;i++){
    36             if(!mark[order[i].i]&&!mark[parent[order[i].i]])
    37             {
    38                 result.push_back(order[i].i); //元素扩展
    39                 mark[order[i].i]=1;   
    40                 mark[parent[order[i].i]]=1;
    41             }
    42         }
    43         cout<<result.size()*1000<<endl;
    44         sort(result.begin(),result.end());
    45         cout<<result[0];
    46         for(i=1;i<result.size();i++){
    47             cout<<" "<<result[i];
    48         }
    49         cout<<endl;
    50     }
    51     return 0;
    52 }
    View Code

    F题:
    死了N遍:为我默哀吧。。。。还是不知道哪错了......正解参照:http://blog.csdn.net/cfreezhan/article/details/8007554(来自学姐~~~)

    我的代码:
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 using namespace std;
     5 class diqu
     6 {
     7 public:
     8     int bian;
     9     int shu;
    10     int leve;
    11 }d[1005];
    12 class student
    13 {
    14 public:
    15     int bian;
    16     int le;
    17     int w;
    18     int di;
    19 }s[1605];
    20 bool cmp(diqu a,diqu b)
    21 {
    22     return a.leve>b.leve;
    23 }
    24 bool cnp(student a,student b)
    25 {
    26     return a.w>b.w;
    27 }
    28 bool cn(student a,student b)
    29 {
    30     return a.bian<b.bian;
    31 }
    32 int main()
    33 {
    34     int n,i,j,num=0;
    35     scanf("%d",&n);
    36     for(i=1;i<=n;i++)
    37     {
    38         scanf("%d",&d[i].shu);
    39         d[i].bian=i;
    40         num=num+d[i].shu;
    41     }
    42     for(i=1;i<=n;i++)
    43         scanf("%d",&d[i].leve);
    44     for(i=1;i<=num;i++)
    45     {
    46         s[i].di=-1;
    47         s[i].bian=i;
    48         scanf("%d",&s[i].le);
    49     }
    50     for(i=1;i<=num;i++)
    51         scanf("%d",&s[i].w);
    52     sort(d+1,d+n+1,cmp);
    53     sort(s+1,s+num+1,cnp);
    54     for(i=1;i<=num;i++)
    55         for(j=1;j<=n;j++)
    56           if(s[i].le>d[j].leve&&d[j].shu)
    57           {
    58               s[i].di=d[j].bian;
    59               d[j].shu--;
    60               break;
    61           }
    62     i=1;
    63     for(j=1;j<=num;j++)
    64         {
    65             if(s[j].di!=-1)
    66                 continue;
    67             while(d[i].shu==0)
    68                 i++;
    69             s[j].di=d[i].bian;
    70             d[i].shu--;
    71         }
    72     sort(s+1,s+num+1,cn);
    73     for(i=1;i<=num-1;i++)
    74         printf("%d ",s[i].di);
    75     printf("%d
    ",s[num].di);
    76     return 0;
    77 }
    View Code

    我擦!!!!最后居然有空格!!!!

    最后两句改成:

    for(i=1;i<=num;i++)
            printf("%d ",s[i].di);

  • 相关阅读:
    Array.from和 map的相同用法
    js复制数组的各种方式
    set集合转数组的两种方法
    关于set集合去重的问题
    Object.is判断两个值是否相等
    数组排序
    函数默认值的取值
    标准索引
    pgsql update left join
    linux pgsql
  • 原文地址:https://www.cnblogs.com/riddle/p/3204722.html
Copyright © 2011-2022 走看看