0709模拟题

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\n",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\n",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\n");return 0;
    }
    if(n==2){
        printf("1\n");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;
}
时间: 2024-10-02 08:58:19

0709模拟题的相关文章

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

cf428c 模拟题

这题说的是给了 n个数然后又 k次 的交换任意位置的 数字的机会  计算最长的连续子序列的和 这要撸  模拟整个 过程 并不能就是算最长的递增序列 如果只是 找最长的 和序列的 话 会存在 很多问题 在替换的时候 每一个决策 都影响着 下一个决策  这样 存在谁与谁替换 这样的状态有 200!种    那就枚举每个区间这样就可以使得 我们所用替换方法得当  因为在替换中我们进行替换是对不同区间的 操作 比如 在替换序列之内的 数字的时候 其实操作的就是不同的区间 与外面的序列进行替换的时候 操作

TOJ1290 Poker Hands 模拟题

寒假期间抽空做的一道模拟题 难度不算大,把每种牌型分开处理,可以合并的步骤考虑合并. 代码比较丑陋,首次尝试Sport Programming的风格,结果搞了个不伦不类(手动笑哭) 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #

hdu 5641 King&#39;s Phone(暴力模拟题)

Problem Description In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen. The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as

HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)

题目 模拟题也各种wa,我最近真的堕落了,,,,,智商越来越为负数了!!!!!!!! #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char mp[10][10]; int d=-1;//0shang,1xia,2zuo,3you int x,y;//weizhi int weizhi(int i,int j) { if(mp[i][j]=='<'){x=

HDU 4930 Fighting the Landlords(扯淡模拟题)

Fighting the Landlords 大意: 斗地主....   分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black & White Joker) > 2 > A (Ace) > K (King) > Q (Queen) > J (Jack) > T (10) > 9 > 8 > 7 > 6 > 5 > 4 > 3. 给你8种组合:1.

锦程网考试由试题从模拟题中批量找出答案,Python

jincin的考试又来了,像往常一样会先有模拟题发下来,而考试题目几乎都在里面原题. 本来是,在考试时,把题目一题一题地在模拟题里搜,但觉得太累了. 于是写了一个Python的脚本批量查找,用到正则,由于不知道行尾是\r还是\n还是\r\n,干脆也用正则,而非split('\r')这么硬板了. 添了颜色,效果不错. Python: 效果: - 锦程网考试由试题从模拟题中批量找出答案,Python,布布扣,bubuko.com

Codeforces 48C The Race 模拟题

题目链接:点击打开链接 题意: 给定n个加油站,一辆车由A点跑到B点,每个100m有一个加油站,每开100m需要10升油. 在每个车站会检查一下油量,若车子若开不到下一个加油站则加x升油. 开始有x升油 下面给出加油的记录. 问下一次加油在哪一站.若答案唯一输出具体哪站. 油箱容量无限 思路: 水模拟.. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>

FZU Problem 2034 Password table (简单模拟题)

这种简单题做了好长时间,我是不是有点逗? 地址:http://acm.fzu.edu.cn/problem.php?pid=2034 不解释了,自己看吧,练手的好题 上个代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <stdio.h> #include <string.h> #include <stdlib.h>