zoukankan      html  css  js  c++  java
  • 7.9模拟比赛解题报告

    7.9模拟比赛

    注:本场考试3道题,时间3个小时。全部为codevs上的题目

    1、2124 美丽的大树

    题目描述 Description

    平江路是苏州最美丽的道路,路中间的绿化带上种了两行漂亮的大树,每行50棵,一共100棵大树,这些大树被编上了号,编号方式如下:

    1 3 5 7 ………… 45 47 49 …………99     第一行

    2 4 6 8 ………… 46 48 50 …………100    第二行

    但是昨天晚上却发生了一件令人震惊的大事--可恶的破坏分子竟然偷去了这100棵大树中的一部分! 公安部门马上出动,列出了被偷去了大树的编号。现在摆在我们面前的情况是,如果你带领的游客走过的旁边是空空的树坑,那是令人无法接受的,因此我们只能压缩游客在平江路上的旅游距离,务必使游客在连续的大树边游玩,当时,我们就得找出一列(边)最长的连续的大树展现在游客面前。请你编写程序解决这一难题。

    输入描述 Input Description

    N (表示有N棵大树被盗) N1 N2 N3……NN  (被盗大树的编号)

    输出描述 Output Description

     M X   (表示从第M棵大树开始,共有连续的X棵大树,如果有多个解,输出M最小的解即可)

    样例输入 Sample Input

     5 9 15 27 35 6

    样例输出 Sample Output

    8 47

    数据范围及提示 Data Size & Hint

    N<=100

    75分代码,特判没有处理好

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N 1010
    int n,vis[N],q[N],o[N],qz,oz;
    int qd,ans;
    int main(){
        scanf("%d",&n);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);vis[x]=1;
            if(x%2) q[++qz]=x;
            else o[++oz]=x;
        }
        sort(q+1,q+qz+1);
        sort(o+1,o+oz+1);
        for(int i=1;i<=qz;i++){
            int j;
            for(j=q[i]+2;!vis[j]&&j<=100;j+=2);
            j-=2;
            if((j-q[i])/2>ans){
                qd=q[i]+2;
                ans=(j-q[i])/2;
            }
        }
        for(int i=1;i<=oz;i++){
            int j;
            for(j=o[i]+2;!vis[j]&&j<=100;j+=2);
            j-=2;
            if((j-o[i])/2>ans){
                qd=o[i]+2;
                ans=(j-o[i])/2;
            }
        }
        int j;
        for(j=q[1]-2;!vis[j]&&j>0;j-=2);
        if((q[1]-j)/2>ans){
            qd=j+2;
            ans=(q[1]-j)/2;
        }
        for(j=o[1]-2;!vis[j]&&j>0;j-=2);
        if((o[1]-j)/2>ans){
            qd=j+2;
            ans=(o[1]-j)/2;
        }
        printf("%d %d
    ",qd,ans);
        return 0;
    }

    题解:讨论奇偶(全奇/全偶/部分奇偶),然后模拟

    AC代码:

    1、(注意特判)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N 1010
    int n,vis[N],q[N],o[N],qz,oz;
    int qd,ans;
    int main(){
        scanf("%d",&n);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);vis[x]=1;
            if(x%2) q[++qz]=x;
            else o[++oz]=x;
        }
        sort(q+1,q+qz+1);
        sort(o+1,o+oz+1);
        if(!qz){
            int j;
            for(j=1;!vis[j]&&j<=100;j+=2);
            j-=2;
            if((j-1)/2+1>ans){
                qd=1;
                ans=(j-1)/2+1;
            }
        }
        else{
            for(int i=1;i<=qz;i++){
                int j;
                for(j=q[i]+2;!vis[j]&&j<=100;j+=2);
                j-=2;
                if((j-q[i])/2>ans){
                    qd=q[i]+2;
                    ans=(j-q[i])/2;
                }
            }
        }
        if(!oz){
            int j;
            for(j=2;!vis[j]&&j<=100;j+=2);
            j-=2;
            if((j-2)/2+1>ans){
                qd=2;
                ans=(j-2)/2+1;
            }
        }
        else{
            for(int i=1;i<=oz;i++){
                int j;
                for(j=o[i]+2;!vis[j]&&j<=100;j+=2);
                j-=2;
                if((j-o[i])/2>ans){
                    qd=o[i]+2;
                    ans=(j-o[i])/2;
                }
            }
        }
    
        int j;
        for(j=q[1]-2;!vis[j]&&j>0;j-=2);
        if((q[1]-j)/2>ans){
            qd=j+2;
            ans=(q[1]-j)/2;
        }
        for(j=o[1]-2;!vis[j]&&j>0;j-=2);
        if((o[1]-j)/2>ans){
            qd=j+2;
            ans=(o[1]-j)/2;
        }
        printf("%d %d
    ",qd,ans);
        return 0;
    }

    2、(不需要特判的讨论)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #define N 110
    using namespace std;
    int vis[N],cnt;
    struct node{
        int len,begin;
    }e[N];
    inline bool cmp(const node &x,const node &y){
        if(x.len>y.len) return 1;
        if(x.len==y.len&&x.begin<y.begin)return 1;
        return 0;
    }
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);
            vis[x]=1;
        }
        bool flag=0;
        for(int i=1;i<=100;i+=2){
            if(!flag&&!vis[i]){
                flag=1;
                ++cnt;
                e[cnt].begin=i;
                e[cnt].len=1;
            }
            else if(flag){
                if(!vis[i])e[cnt].len++;
                else flag=0;
            }
        }
        flag=0;
        for(int i=2;i<=100;i+=2){
            if(!flag&&!vis[i]){
                flag=1;
                ++cnt;
                e[cnt].begin=i;
                e[cnt].len=1;
            }
            else if(flag){
                if(!vis[i]) e[cnt].len++;
                else flag=0;
            }
        }
        sort(e+1,e+cnt+1,cmp);
        printf("%d %d",e[1].begin,e[1].len);
        return 0;
    }

    2、1507 酒厂选址

    题目描述 Description

    Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒。以前这种啤酒都是从波兰进口,但今年居民们想建一个自己的啤酒厂。岛上所有的城市都坐落在海边,并且由一条沿海岸线的环岛高速路连接。酒厂的投资者收集了关于啤酒需求量的信息,即每天各城市消费的啤酒桶数。另外还知道相邻城市之间的距离。每桶啤酒每英里的运费是1元。日运费是将所需要的啤酒从酒厂运到所有城市所必需的运费之和。日运费的多少和酒厂的选址有关。投资者想找到一个合适的城市来修建酒厂,以使得日运费最小。

    请设计一个程序:从文件bre.in 读入城市的数目、相邻两城市间的距离以及每个城市消费的啤酒桶数,计算最小的日运费,将结果写到输出文件bre.out中。

    输入描述 Input Description

    第一行是一个整数n(5 <= n <= 10000) ,表示城市的数目。 城市沿高速路编号,使得相邻的城市的编号也相邻(城市1和n也被认为是相邻)。 以下的n行,每行有两个非负整数。第I+1行的数 zi、di分别是城市I每日的啤酒消费量(桶)和从城市I沿高速路到下一个城市的距离(英里)。高速路的总长不会超过65535 英里。每座城市的日消费量不会超过255桶。

    输出描述 Output Description

    一个整数,表示所需的最小日运费(元)。

    样例输入 Sample Input

    6

    1 2

    2 3

    1 2

    5 2

    1 10

    2 3

    样例输出 Sample Output

    41

    数据范围提示:

     

    文本:

        int ://int范围至少需要9位数(保守起见) 
            //单纯取大: 
            0x7f------------127
               memset(a,127,sizeof a);
                  a[0]------2139062143                  //(2e9)
            0x7fffffff------2147483647                  //(2e9)
            //还要运算:
               memset(a,127/3,sizeof a);
                  a[0]------707406378                   //(2e9)
            0x3f3f3f3f------1061109567                  //(1e9)
             
    
        long long ://long long范围至少需要13位数(保守起见) 
            //一般情况下取大和运算:
            0x7ffffffffff-----------8796093022207       //(8e13)
            //极限取大: 
            9223372036854775807LL---9223372036854775807 //(9e19)

    AC代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N 10010
    long long n,v[N],d[N],s[N],sum;
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>v[i]>>d[i];
            sum+=d[i];
            s[i]=s[i-1]+d[i-1];
        }
        long long ans=0x7ffffffffff;
        for(int i=1;i<=n;i++){
            long long t=0;
            for(int j=1;j<=n;j++){
                if(i!=j){
                    long long q=abs(s[j]-s[i]);
                    long long dis=min(q,sum-q);
                    t+=dis*v[j];
                }
            }
            ans=min(ans,t);
        }
        cout<<ans<<endl;
        return 0;
    }

    3、1697 ⑨要写信

    题目描述 Description

    琪露诺(冰之妖精)有操控冷气的能力。能瞬间冻结小东西,比普通的妖精更危险。一直在释放冷气的她周围总是非常寒冷。

    由于以下三点原因……

    • 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你;
    • ZUN在《红魔乡》中介绍她时已经说她有点笨笨的了;
    • 在ZUN放出《东方花映冢》的介绍图时,在图中把琪露诺放在了⑨的位置上,并以“⑨笨蛋”简单带过,从此“⑨”及“笨蛋”就成为她的别名了……

    所以琪露诺便得到了“笨蛋”的别称。

    某日,琪露诺又2了……

    她写了N封信要装到N个信封里面,却全都装错了……现在想知道有多少种装错的可能性。

    输入描述 Input Description

    信和信封的数量N。

    输出描述 Output Description

    装错的可能性的数量。

    样例输入 Sample Input

    输入样例1

     

    2

    输入样例2

     4

     

    样例输出 Sample Output

    输出样例1 

    1

    输出样例2

     9

    数据范围及提示 Data Size & Hint

    1≤N≤100

    //方程:f[i]=(f[i-1]+f[i-2])*(i-1){f[1]=0,f[2]=1}
    //f[i]表示i封信要装到i个信封里面全都装错有f[i]种可能性 
    //本题还需要用高精度 
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define N 510
    int n,a[N],b[N],c[N],az,bz,cz;
    int main(){
        scanf("%d",&n);
        b[1]=1;
        az=bz=1;
        if(n==1){
            printf("0
    ");return 0;
        }
        if(n==2){
            printf("1
    ");return 0;
        }
        for(int i=3;i<=n;i++){
            cz=bz;
            for(int j=1;j<=cz;j++){
                c[j]+=(i-1)*(a[j]+b[j]);
                c[j+1]+=c[j]/10;
                c[j]%=10;
            }
            for(;c[cz+1]!=0;cz++){
                c[cz+2]+=c[cz+1]/10;
                c[cz+1]%=10;    
            }
            for(int i=0;i<N;i++) a[i]=b[i];az=bz;
            for(int i=0;i<N;i++) b[i]=c[i];bz=cz;
            memset(c,0,sizeof c);
        }
        while(b[bz+1]!=0) bz++;
        if(b[bz]==0) bz--;
        for(int i=bz;i>=1;i--) printf("%d",b[i]);
        puts("");
        return 0;
    }
  • 相关阅读:
    全局变量 和 局部变量
    函数
    字符串拼接
    集合
    字典
    元祖
    列表
    Python 字符串 小练习
    ssm多数据源配置
    JAVA笔记:double四舍五入并保留两位小数的方法
  • 原文地址:https://www.cnblogs.com/shenben/p/5655861.html
Copyright © 2011-2022 走看看