昨日学长曰:明天每人找一道坑题,互坑~~于是乎………………
一道一道来吧~
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各路神犇