2015 湘潭大学程序设计比赛(Internet)部分题解,其中有一个题与NYOJ1057很像,贪心过~~...

仙剑奇侠传

                祝玩的开心                                                                                                                      A的满意                   
Time Limit : 2000 MS Memory Limit : 65536 KB

题目描述

李逍遥被困在镇妖塔内,为了杀出去,免不了需要打赢大Boss。奈何现在等级太低,只能先打打小怪练级了。 李逍遥只能打赢不比自己等级高的怪物。每次战斗都可以获得经验值,经验值是10/(李逍遥等级-怪物等级+1)。 每获得100点经验值,就会升一级。当然,如果遇到打不赢的怪物,那就鞋底抹油,溜之大吉。现在给你李逍遥的初始等级, 依次遇到的怪物级别,问最后李逍遥的级别和经验值(初始的经验值为0)。

输入

第一行是一个整数T(T ≤ 100),表示样例的个数。 样例的第一行是两个整数N(1≤N≤10000),L(1≤L≤100)。 样例的第二行是N个整数X_i,(1≤X_i≤200),表示依次遇到的怪物等级。

输出

每行输出一个样例的结果,为两个整数,分别表示李逍遥最后的等级和经验值。

样例输入
2
11 1
1 1 1 1 1 1 1 1 1 1 1
20 2
2 2 2 2 2 2 2 2 2 2 2 4 1 1 1 1 1 1 1 4

样例输出
2 105
3 126


Source

ericxie

第一题,一个签到题,可是我却做了好久,原来是有个地方没考虑到,总之,谨慎行事,思维敏捷就好;

int main()//为了节省空间,头文件就删了;
{
    int t,n,l,a;
    scanf("%d",&t);
    while(t--)
    {
        int sum=0,x=0;
        scanf("%d%d",&n,&l);
        while(n--)
        {
            scanf("%d",&a);
            if(l>=a)
                x+=10/(l-a+1),sum+=10/(l-a+1);
            if(x>=100)
            {
                l++;
                x-=100//当时这里是直接把x赋为0,真是不应该;
            }
        }
        printf("%d %d\n",l,sum);
    }
    return 0;
}



折叠

                                  祝玩的开心                                                                                                                                A的满意
Time Limit : 1000 MS Memory Limit : 65536 KB

Problem Description

给一个正整数x,请将x对半折叠,对位求和。比如说123,对半折叠对位求和,就是42;1234对半折叠就是12+43=55。

Input

第一行是一个整数T,表示样例的个数。 以后每行一个正整数x,0≤x≤109

Output

每行输出一个样例的结果。

Sample Input
4
1
12
123
1234

Sample Output
1
3
42
55


Source

ericxie
第二道签到题,思维清晰敏捷绝对没问题,观察测试数据就明白了,于是我们分奇偶,偶数直接分为两部分再相加,奇数中间那个数可以任意归为一方,但另一方要乘以10再相加;
int a[15];
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int i=0;
        while(n)
        {
            a[i++]=n%10;
            n/=10;
        }
        int aa=0,bb=0;//分为前后两部分,再相加;
        for(int j=i-1; j>=i/2; j--)
            aa=aa*10+a[j];
        for(int j=0; j<i/2; j++)
            bb=bb*10+a[j];
        if(i%2)
            bb*=10;
        printf("%d\n",aa+bb);
    }
    return 0;
}


 “ Digit ” 这个题还没搞懂,不过cF上有一个类似的题,没这个题这么变态,数据小的话可以直接打表打开链接




最小的数

祝玩的开心                                                                                                                               A的满意
Time Limit : 1000 MS Memory Limit : 65536 KB

题目描述

给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么

(n位且不能含前导零)?

输入

有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开;

输出

最终能得到的最小的数。

样例输入
2
321654987 1
321654987 2

样例输出
231654987
132654987


Source

WCB

    这道题看起来很麻烦,其实也就是考思路,只要思路清晰,思维敏捷,也是不在话下的;

     这道题和NYOJ贪心专题里的寻找最大数(三)简直一模一样,不过NYOJ上的题还比较水,不管是数据还是时限,但思路都一样,欢迎来水,打开链接

    思路就是:第一个单独判,因为不能有前导0,所以从当前位往后的k位中找一个最小的(注意不能为0)如果比当前位还小便可以交换,然后判断交换的次数,k减之,后面的操作几乎一样,从第二位开始便可以有0了,还是从当前位出发,往后k位中找一个最小的如果比当前位还小又可以交换,这样一直下去,注意当整个串都是非递减的时候就可以直接输出了;

const int N=1000+10;
char a[N];
int main()
{
    int t,k,i,x;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%d",a,&k);
        x=strlen(a);
        if(k==0)
        {
            printf("%s\n",a);
            continue;
        }
        int l=0;
        int pos=l;
        for(i=l+1; i<=l+k&&i<x; i++)//判第一位;
            if(a[pos]>a[i]&&a[i]!='0')
                pos=i;
        if(pos!=l)//符合条件可以交换;
        {
            for(i=pos; i>0; i--)
                swap(a[i],a[i-1]);
            k-=pos-l;//减去相应的次数;
        }
        l++;
        while(k)
        {
            int f=1;
            for(i=1; i<x-1; i++)
                if(a[i]>a[i+1])
                    f=0;
            if(f) break;//如果这个串都非递减则已经是最小的了;
            pos=l;
            for(i=l+1; i<=l+k&&i<x; i++)
                if(a[pos]>a[i])//同样的操作,只不过可以有0移至前面;
                    pos=i;
            if(pos==l)//如果这个范围内本身(当前位)就是最小的,那么不用交换,直接看下一位;
            {
                l++;
                continue;
            }
            for(i=pos; i>l; i--)
                swap(a[i],a[i-1]);
            k-=pos-l,l++;
        }
        printf("%s\n",a);
    }
    return 0;
}
  其他题还没A,其实博主2015年还在上高中 大笑,这是2016年才补的几道题,博主水平较低,欢迎提出宝贵意见和建议;

转载于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208233.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值