现场编程比赛普及组初赛答案

问题 A: 光棍节的大穿越
时间限制: 1 Sec 内存限制: 128 MB
提交: 67 解决: 5
[提交][状态][讨论版] [Edit] [TestData]
题目描述
“祝天下有情人都是失散多年的亲兄妹。”
“今年双十一呀,拆散一对是一对。”  

为了让单身狗们有一个不被情侣秀的光棍节,“ACM配基穿(chai)越(san)集团”举行了情侣大穿越活动,在光棍节当天,只要是情侣,只要报名了“情侣大穿越”,可以选择“向前穿越”D天。

为了拆散情侣,男生的向前穿越是穿越到未来,女生的向前穿越是穿越到古代,这样,单身狗们就可以开心了。

已知现在的日期(2015/11/11)和穿越的天数D,聪明的棍儿,你能算出一对情侣男生和女生分别到达的年份和月份吗?

输入
输入首先包含一个整数N,表示有N组测试用例;
接下来N行是N组数据,每一行包含一个整数D***(abs(D)<=10,0000)*,D表示向前穿越的天数。

输出
请计算并输出男友和女友分别到达的日期,日期格式为YYYY/MM/DD,两个日期中间用一个空格隔开,每组数据占一行,具体输出格式请参见样例。

样例输入
1
2
样例输出
2015/11/13 2015/11/09

这一题主要是数据范围,时间是可以有负数的。
原题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=4515

#include<stdio.h>
#include<string.h>
int md[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int isLoopYear(int y){
    if((y%4==0&&y%100!=0)||(y%400)==0) return 1;
    else return 0;
}
void getADay(int y, int m, int d,int days){//向后推
    int i;
    for(i = 1;i <= days;i++){//按照天算比较灵活
        if(isLoopYear(y))
            md[2] = 29;
        else
            md[2] = 28;

        d++;
        if(d > md[m]){
           d = 1;
           m++;
           if(m > 12){
              m=1;
              y++;
           }
        }
    }
    //printf("%d\t%04d/%02d/%02d ",days,y,m,d);
    printf("%04d/%02d/%02d",y,m,d);
}
void getBDay(int y, int m, int d, int days){//向前推
    int i;
    for(i=1;i<=days;i++){
        if(isLoopYear(y))
            md[2]=29;
        else
            md[2]=28;

        d--;
        if(d<1){
            m--;
            if(m<1){
                m=12;
                y--;
            }
            d=md[m];
        }
    }
    printf("%04d/%02d/%02d",y,m,d);
}

int main(){

    int y=2015, m=11, d=11, days,n;
    scanf("%d",&n);
    while(n--){
        scanf("%d",&days);
        if(days >= 0)//判断输入是正数还是负数
        {
            getADay(y,m,d,days);
            printf(" ");
            getBDay(y,m,d,days);
        }
        else{
            getBDay(y,m,d,-days);
            printf(" ");
            getADay(y,m,d,-days);
        }
        printf("\n");
    }
    //system("pause");
    return 0;
}

问题 B: 耿小霞的公交
时间限制: 1 Sec 内存限制: 128 MB
提交: 358 解决: 48
[提交][状态][讨论版] [Edit] [TestData]
题目描述
耿小霞在河海大学百年校庆的时候一个人去了本部,在公交车上发现南京的公交车有这样的一种运行规律:

一共有n个站台,每个站台有Ai个人, 但是一辆车只能载m个人,如果这辆车不能装下某一站的所有人,则这一站和接下来的每一站的人都不上车而等下一辆车。

那么问题来了,搭载所有人需要多少辆车?

输入
输入n,表示n个站台, m表示一辆车可以搭载多少人(1 <= m , n <= 100),接下来的一行有n个数A1, A2, A3 …Ai… An(Ai < m),分别表示每个站台有多少人。

输出
输出一共需要多少辆车。

样例输入
4 3
2 3 2 1
样例输出
3
提示
输入:
3 4
1 2 1

输出:
1

提示:这题简单的使用循环就好了

#include<iostream>
using namespace std;
int main()
{
    int i,n,m,ara[1000];
    cin>>n>>m;
    for(i=0;i<n;i++)
        cin>>ara[i];
    int sum=0,ans=1;
    for(i=0;i<n;i++){
        sum=sum+ara[i];//装下当前站的人
        if(sum>m){     //装不下当前站的人
            i--;
            sum=0;
            ans++;     //车辆数加一
        }
    }
    cout<<ans<<endl;
}

问题 C: 最大素因子
时间限制: 1 Sec 内存限制: 128 MB
提交: 187 解决: 17
[提交][状态][讨论版] [Edit] [TestData]
题目描述
许唱最近正在学习素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数。
例如:2的序数是1,3的序数是2,5的序数是3,以此类推。读题是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0.
输入
对于输入数据, 输入一个数据n.(0

#include <iostream>
#include <string.h>
#include <cstdio>
#include <cmath>
using namespace std;
const int mmax=1000005;
int k=0,prime[500005],num[mmax];
bool flag[mmax];
void init(){    //赋初值,初始化
    memset(flag,0,sizeof(flag));
    memset(num,0,sizeof(num));
    for(int i=2;i<=(int)sqrt(mmax*1.0);++i){
        if(!flag[i]){
            for(int j=i*i;j<mmax;j+=i){
              flag[j]=1;
            }
        }
    }
    k=0;
    for(int i=2;i<mmax;++i){
        if(!flag[i]){
          prime[k]=i;
          num[i]=k;
          k++;
        }
    }
}
int fenjie(int n){
    int i;
    for(i=0;prime[i]<=(int)sqrt(n*1.0);++i){
        if(n==1)break;
        if(n%prime[i]==0){
            while(n%prime[i]==0){
              n/=prime[i];
            }
        }
    }
    if(n==1)
    return prime[i-1];
    else return n;
}
int main(){
    init();
    int n;
    while(~scanf("%d",&n)){
        if(n==1){puts("0");}
        else{
          int x=fenjie(n);
          printf("%d\n",num[x]+1);
        }
    }
    return 0;
}

问题 D: 导弹拦截
时间限制: 1 Sec 内存限制: 128 MB
提交: 193 解决: 10
[提交][状态][讨论版] [Edit] [TestData]
题目描述
盘颜星是银河系里面非常有实力的一颗星球,但是现在并不太平,为了防御敌对星球万星的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。某天,雷达捕捉到万星的导弹来袭。由于该系统还在试用阶段,所以只有一种系统,因此有可能不能拦截所有的导弹。

怎么办呢?多搞几套这样的系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊。所以盘颜星人就到这里来求救了,请帮助计算一下拦截所有导弹最少需要多少套拦截系统。

输入
每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于1000的正整数,用空格分隔)

输出
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统。

样例输入
8 389 207 155 300 299 170 158 65
样例输出
2
提示
由于数据原因,不要使用eof作为终止输入,输入一组就好

原题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1257
思路: 就是每出现一个导弹, 用当前距离最近的拦截系统去拦截。。不能拦截了就新开一个拦截系统。同时用数组记录每个拦截系统当前的高度。
详情请点击:http://blog.csdn.net/sjf0115/article/details/8715672

代码:

#include<stdio.h>
#define INF 0x7ffffff
#define MAXN 10000
int dp[MAXN];//dp[i]代表第i个导弹当前拦截的高度
int main()
{
    int n,x,i,res,flag;
    int minh;
    scanf("%d",&n);

    res=0;
    while(n--)
    {
        scanf("%d",&x);
        flag=0;
        minh=INF;
        int tempi;
        for(i=0; i<res; i++)
        {
            if(x<=dp[i]&&minh>dp[i]-x)
            {
                minh=dp[i]-x;
                //dp[i]=x;
                tempi=i;
                flag=1;
            }
        }
        if(flag==0)
        {
            dp[res]=x;
            res++;
        }
        else dp[tempi]=x;
    }
    printf("%d\n",res);

    return 0;
}

问题 E: 剪刀石头布
时间限制: 1 Sec 内存限制: 128 MB
提交: 127 解决: 10
[提交][状态][讨论版] [Edit] [TestData]
题目描述
程序屠宰场是孤独的,最近一个人在玩剪刀石头布的游戏,纳尼?一个人怎么玩剪刀石头布?仿佛看见有人在逗我笑。
然而程序屠宰场的确在一个人玩剪刀石头布。
他假设有n个人围成一圈,每个人可以出剪刀、石头或者布。相邻的人不能出同一种手势,程序屠宰场想知道n个人有多少种不同的出法。
那么聪明的你能帮程序屠宰场算一下吗?

输入
测试实例占一行,由一个整数n组成。(0

#include<stdio.h>
int main()
{
    long long n,a[60];

    a[1]=3,a[2]=a[3]=6;
    for(int i=4; i<=50; i++)
        a[i]=a[i-1]+2*a[i-2];
    scanf("%lld",&n);
        printf("%lld\n",a[n]);
    return 0;
}

问题 F: 丘薛铭表白记
时间限制: 1 Sec 内存限制: 128 MB
提交: 169 解决: 16
[提交][状态][讨论版] [Edit] [TestData]
题目描述
丘薛铭热爱编程,俗话说,程序员都是注孤生的,丘薛铭不服。所以丘薛铭想要给他的女神表白,但是怎么表白呢?丘薛铭想了很久,想不出来,所以就去问夏黑,夏黑给了邱薛铭一个数字:527,然后就让邱薛铭离开了。
邱薛铭内心一万匹草泥马奔过,这是什么鬼。后来发现527 = 520+5+2+0,所以527是520衍生出来的。丘薛铭把“527”称作“表白暗号”,把“520”称作表白数,即520是527的表白数。
然后丘薛铭就把201325发给了他的女神,但是又担心他的女神看不懂,所以想要写一个用来作“翻译”的代码。为了邱薛铭的爱情,聪明的你能帮帮他吗?

输入
输入一个数t,表示接下来有t组测试样例
接下来的t行,每一行输入一个数n,表示表白暗号(1 <= n <= 20,000,000)。

输出
对于每一个表白暗号,输出其对应的表白数。

如果没有表白数,则输出0

样例输入
3
201325
527
19960263
样例输出
201314
520
19960227

思路:因为n的范围为1 <= n <= 20,000,000,所以用循环的话会直接超时不能过的,简单的思路就是从8*9 = 72(8表示20000000为8位数), 从表白暗号的前72个数开始循环。

代码:

#include <stdio.h> 

int main() 
{ 

    int m, n, k, a; 
    scanf("%d", &n); 
    while(n--) 
    { 
        scanf("%d", &a); 
        m = 0; 
        int flag = 0; 
        for(int i = a-100; i <= a; i++) //开始循环
        { 
            m = i; 
            k = i; 
            while(k%10 != k) //求出各个位数与原数的和
            { 
                m += k%10; 
                k /= 10; 
            } 
            m += k%10; 
            if(m == a) //相等则跳出循环
            { 
                printf("%d\n", i); 
                flag = 1; //搜索到结果做状态标记
                break; 
            } 
        } 
        if(flag == 0) 未搜索到输出0
            printf("0\n"); 
    } 
    return 0; 
} 

初赛:题目有点偏难,但是两做出两道题还是很简单的。

你可能感兴趣的:(编程,科协)