Loi 2015.8.27 TEST 坑题互测

昨日学长曰:明天每人找一道坑题,互坑~~于是乎………………
一道一道来吧~
T1:Loi_imcy(打死曹远)

题目描述:
我大天朝有一款为各家各户所熟知的游戏——《拳皇》,M作为《拳皇 》的脑残粉,今天又来Loi虐场了!
M转念一想,觉得自己是在太厉害了,不能只是干掉对手,那样就显得自己太弱了,
他想要做到能控制自己打完还剩下多少血量。于是他就搞来了各个角色的能力值,对于两个能力值不同的角色,能力值高的肯定会赢啦,赢后会剩下(自己的能力值 - 对手的能力值)的血量,
于是M就想知道有多少对角色在对战后赢得一方会剩下C(保证C不为0)点血量,然而M对于减法很是不擅长,于是就交给了会编程的你。
输入描述:
第一行为两个非负整数N和C,表示有N个角色,要剩C点血量。
第二行有N个数,分别表示1 - N个角色的能力值。
输出描述:
输出一个整数,表示一共有多少对角色符合要求。
样例输入:
4 1
1 1 2 3
样例输出:
3
数据范围:
n <= 1000000 , 答案保证在int范围内。
数据纯random , 请随意乱搞。

看完题暴力就能想出来,但是数据范围暴力显然过不去,然后我们想别的办法:既然所有状态枚举量太大,那么我们可不可以只枚举对结果有影响的答案呢?显然是可以的,我们用一个来记录一个数字出现的次数,同时记录最大值和最小值,那么我们就可以从最大值开始枚举差值为c,并且左右端点在maxx和minn之间的数,这样枚举量就少了许多。时间复杂度也只是扫一遍而已。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
const int size = 100010;
const int INF = 2 << 28;
int num[size];
ll ans;
int maxx = -INF,minn = INF;
int main()
{
    freopen("M.in","r",stdin);
    freopen("M.out","w",stdout);
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i = 1;i <= n;i ++)
    {
        int a;
        scanf("%d",&a);
        num[a] ++;
        maxx = max(maxx,a);
        minn = min(minn,a);
    }
    for(int i = maxx,j = maxx-k;j >= minn;i--,j--)
    {
        ans += (ll)(num[i]*num[j]);
    }
    printf("%lld",ans);
    return 0;
}

/*
4 1
1 1 2 3
*/

T2:Zzz(打死zzz)

题面是图片格式0.0
这里写图片描述

题目坑在:
1、一个汉字对应两个空格,不解释…………
2、在devc下是蓝色,什么样的是蓝色?开始很郁闷,后来想了想,双引号或者注释就可以,于是……
变成了水题
代码…………:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;

int main()
{
    freopen("MMM.out","w",stdout);
    printf("%c龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘  龘龘龘龘龘龘        龘龘龘龘龘  龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘  龘龘龘龘龘龘  龘龘  龘龘龘龘龘龘龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘  龘龘龘龘龘龘  龘龘  龘龘龘龘龘  龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘  龘龘龘龘龘龘  龘龘  龘龘龘龘龘  龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘  龘龘龘龘龘龘  龘龘  龘龘龘龘龘  龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘      龘龘龘龘        龘龘龘龘龘  龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘%c\n",'"','"');
    printf("%c龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘龘%c",'"','"');
    return 0;
}

T3:darkfamles(拼错了不要怪我)
题面:BZOJ2761
这题找了道现成的,BZOJ非权限水题之一,本以为一遍AC,没想到还是有坑=-= PE………………
可能是平时打习惯了不在意输出格式了没想到真有题卡PE =-=
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
using namespace std;
map <int,bool> maps;
int pre[50010];
int main()
{
    int t;
    scanf("%d",&t);
    for(int i = 1;i <= t;i ++)
    {
        maps.clear();
        memset(pre,0,sizeof(pre));
        int tot = 0;
        int n;
        scanf("%d",&n);
        for(int j = 1;j <= n;j ++)
        {
            int a;
            scanf("%d",&a);
            if(!maps[a])
            {
                maps[a] = 1;
                pre[++tot] = a;
            }
        }
        printf("%d",pre[1]);
        for(int j = 2;j <= tot;j ++)
        {
            printf(" %d",pre[j]);
        }
        if(i != t)
        {
            puts("");
        }
    }
    return 0;
}
/*
2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6
*/

T4:ZXK(新同学出的题也很坑啊=-=)
题面:codevs1084
我觉得题目有2坑:
1、乒乓球并不是打到11或者21就结束,必须要分差大于2并且分数大于等于11 或 21才行。
2、如果边读边处理需要注意continue可能会把原本该处理的部分没有处理,比如同时打到11和21的边界,判断11直接contnue调就坑爹了~,这样说可能有点不大明白,看代码吧

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int size = 100010;
char c;
struct Dqs{int l,r;}dqs[size];  //11赛制
struct Dc{int l,r;}dc[size];    //21赛制
//结构体里面l是本人得分,r是对手得分 
int tot1 = 1,tot2 = 1;
int main()
{
//  freopen("in.in","r",stdin);
//  freopen("out2.out","w",stdout);
    memset(dqs,0,sizeof(dqs));
    memset(dc,0,sizeof(dc));
    while(233)
    {
        scanf("%c",&c);
        if(c == 'E')    break;
        if(c == 'W')    //如果本人得分 
        {
            dqs[tot1].l ++;//11赛制和21赛制都要加 
            dc[tot2].l ++;
            if(dqs[tot1].l >= 11)   //如果达到了胜利的第一个条件 
            {
                if(dqs[tot1].l - dqs[tot1].r <= 1)//如果没达到了胜利的第二个条件 
                {
                    if(dc[tot2].l - dc[tot2].r >= 2 && dc[tot2].l >= 21)
                    {
                        //坑就在这,如果达到21赛制胜利条件,但是continue就会导致下面的操作没有执行,所以要特判 
                        tot2 ++;
                    }
                    continue;
                }
                tot1 ++;
            }
            if(dc[tot2].l >= 21)
            {
                //由于先判断11赛制所以21赛制时不用特判 
                if(dc[tot2].l - dc[tot2].r <= 1)
                {
//                  cout<<"fuckkkkkkkkkk "<<dc[tot2].l<<"  "<<dc[tot2].r<<endl;
                    continue;
                }
                tot2 ++;
            }
        }
        else if(c == 'L')
        {
            dqs[tot1].r ++;
            dc[tot2].r ++;
            if(dqs[tot1].r >= 11)
            {
                if(dqs[tot1].r - dqs[tot1].l <= 1)
                {
                    if(dc[tot2].r - dc[tot2].l >= 2 && dc[tot2].r >= 21)
                    {
                        tot2 ++;
                    }
                    continue;
                }
                tot1 ++;
            }
            if(dc[tot2].r >= 21)
            {
                if(dc[tot2].r - dc[tot2].l <= 1)
                {
                //  cout<<"fuckkkkkkkkkk "<<dc[tot2].l<<"  "<<dc[tot2].r<<endl;
                    continue;
                }
                tot2 ++;
            }
        }
    }
    for(int i = 1;i <= tot1;i ++)
    {
        printf("%d:%d\n",dqs[i].l,dqs[i].r);
    }
    puts("");
    for(int i = 1;i <= tot2;i ++)
    {
        printf("%d:%d\n",dc[i].l,dc[i].r);
    }
    return 0;
}

上面的是我考试的时候做了并且AC(乒乓球70)的题=-=,下面就是坑题了。

T5:Loi_Seavot (QAQ)

【题目描述】

2015 年数学省联赛出现了这样一道题目:已知 x,y 为整数,且满> 足以下

两个条件:

1. x,y∈[1…k],且 x,y,k∈Z
2. (x^2-xy-y^2)^2=1
给你一个整数 k,求一组满足上述条件的 x,y 并且使得 x^2+y^2 > 的值最大。
【输入格式】
一个整数 k
【输出格式】
输出文件仅一行,两个整数;两个整数分别表示 x 和 y。x,y 之间> > 用一个 空格隔开。
【输入样例】
1995
【输出样例】
1597 987
【数据范围】
对于 40%的数据:2≤k≤104

对于 100%的数据:2≤k≤1018

我出的题还是很良心的,暴力给了40分,但是没人做……
简单数轮题:
上式化简可得(x+y)(x-y) - xy = (+1 || -1)
如果y > x,则上式不成立,所以x>=y
继续:( x ^2 – xy – y ^2 )^ 2 = [ ( x + y )^ 2 – x ( x + y ) – x^ 2 ] ^2 =1
//上面的’^’均代表次幂。
//对上式解释,左边提出负号,有边化简,得到左右相等(因为有一个平方关系)
那么我们可以发现: x,y 满足条件 2 时,(x+y),x 一定也满
1 1 满足2,也就是说满足2条件的x,y是斐波那契中的某一项。
我们要求x^2+y^2最大,x,y又<=k,则找到小于k的最大的相邻的两项FIB就是最终结果,并且x>=y;
结果在llu之内所以不打高精QAQ我好良心
代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    freopen("puzzle9.in","r",stdin);
    freopen("puzzle9.out","w",stdout);
    unsigned long long n;
    cin>>n;
    unsigned long long a = 1,b = 1,c = 2;
    while(c <= n)
    {
        a = b;
        b = c;
        c = a + b;
    }
    cout<<b<<" "<<a;
    return 0;
}

//yl fib 16 && 17;

时间复杂度 O(雾),空间复杂度 O(雾)

T6:Loi_rainheart(Orz)

>

【问题描述】

哪里有压迫,哪里就有反抗。

moreD 的宠物在法庭的帮助下终于反抗了。作为一只聪明的宠物他打算把魔 法使 moreD 的魔法书盗去,夺取 moreD 的魔法能力。但 >moreD 怎么会让自己的 魔法书轻易地被盗取?moreD 在魔法书上>>设置了一个密码锁,密码锁上有一个 问题。

施以斯卧铺魔法吧,你有 M 次机会,如此将得完美密码。

然后是一串小写字母串。

moreD 的宠物斯卧铺魔法就是施法时的字符串其中相邻两位交换。

而 moreD 对于完美密码的定义自然是最小字典序了。

请帮助 moreD 的宠物,想出密码吧。

【输入格式】

第一行一个整数 M,表示操作次数。

第二行一串小写字母组成的字符串 S,如题目所示。

【输出格式】

输出完美密码。

【输入样例】

3

dcba

【输出样例】

adcb

【数据范围】

对于 30%的数据|S|≤10

对于 60%的数据|S|≤3,000

对于 100%的数据 8≤|S|≤100,000 M≤(|S|-8)^2+2

题目读完的时候我想到一中贪心策略:因为字典序从左往右比较,也就是让左边的字母尽可能小,没想到这种贪心策略居然是对的……但是由于对字符串比较敏感外加字符串弱只会个KMP于是就没敢打。
代码?!

还有3个题不管题面还是解法都很坑,而且其本人并没有交出std,于是不写了……并且题目本身还有一些BUG,以被hack掉

后排Orz各路神犇

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值