牛客练习赛4(A+B)

来源:互联网 发布:java游戏破解版网站 编辑:程序博客网 时间:2024/05/29 07:01

Laptop

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。

输入描述:

第一行一个正整数n,表示笔记本的数量。接下来n行,每行两个正整数Mi,Si表示这款笔记本的内存和速度。n≤105,Mi,Si≤109

输出描述:

一行,一个正整数,表示被完虐的笔记本数。
示例1

输入

4100 700200 50050 100300 400

输出

1

备注:

Mi和Si都是越大越优。数据保证Mi互不相同,Si也互不相同。
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;long long n,mm,ans,ma;struct pc{    long long m,s;}a[100010];bool cmp(pc a,pc b){    return a.m<b.m;}int main(){    scanf("%lld",&n);    for(long long i=0;i<n;i++)    {        scanf("%lld%lld",&a[i].m,&a[i].s);    }    sort(a,a+n,cmp);    for(long long i=n-1;i>=0;i--)    {        if(i==n-1)        {            ma=a[i].s;        }        else{            if(a[i].s<ma)            {                ans++;            }            else            {                ma=a[i].s;            }        }    }    cout<<ans<<endl;    return 0;}

Distance

题目描述

FST作为小朋友,经常会遇到和距离有关的问题,但是他已经厌倦了曼哈顿距离和欧几里德距离,所以FST就定义了一种FST距离。这种距离并不用于空间或平面中,而运用于FST发明的一些神奇的算法中(唔... ...)。设i号元素的特征值为Ai,则i和j的FST距离是 |i2 - j2|+|Ai2 - Aj2|。为了实现某新的数据结构,FST想在一大堆元素中找出距离最大的一对元素,他不关心是哪一对元素,只想求出最大距离。

输入描述:

第一行,一个正整数n,为元素个数。第二行,n个正整数Ai为这n个元素的特征值。

输出描述:

一行,一个正整数表示最大距离。long long请用lld
示例1

输入

24 3

输出

10

备注:

n≤105,Ai≤109
有四种情况,就是i2-j2>=0,i2-j2<0,ai2-aj2>=0,ai2-aj2<0,但是总的其实就是两种情况,分别算一下就可以了。
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;long long n,a[100010],m1[100010],m2[100010],ans;int main(){    scanf("%lld",&n);    for(long long i=1;i<=n;i++)        scanf("%lld",&a[i]);    for(long long i=1;i<=n;i++)        m1[i]=i*i+a[i]*a[i];    for(long long i=1;i<=n;i++)        m2[i]=i*i-a[i]*a[i];    sort(m1+1,m1+n+1);    sort(m2+1,m2+n+1);ans=max(m1[n]-m1[1],m2[n]-m2[1]);    cout<<ans<<endl;    return 0;}

Fancy Signal Translate 
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K64bit IO Format: %lld

题目描述

FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。但是重点在于,他真的很强!他发明了一种奇特的加密方式,这种加密方式只有OIer才能破解。这种加密方式是这样的:对于一个01串,他会构造另一个01串,使得原串是在新串中没有出现过的最短的串。现在FST已经加密好了一个串,但是他的加密方式有些BUG,导致没出现过的最短的串不止一个,他感觉非常懊恼,所以他希望计算出没出现过的最短的串的长度。

输入描述:

一行,一个01串。长度≤105

输出描述:

一行,一个正整数,表示没有出现过的最短串的长度。
示例1

输入

100010110011101

输出

4
看到这题,有的用字典树,有的用hash,最后这个才是最简单的啊,直接用一个map存储,算有多少个不同的数,和2的n次幂比较,直接就出来了,也可能数据比较弱。
#include<stdio.h>#include<algorithm>#include<string.h>#include<map>#define N 100005using namespace std;typedef long long ll;char s[N];map<int,int>mp;int main(){    scanf("%s",s);    int ans,n=strlen(s);    for(int k=1;;k++){        mp.clear();        for(int i=0;i+k<n;i++){            int x=0;            for(int j=0;j<k;j++)                x=x*2+s[i+j]-'0';            mp[x]++;        }        if(mp.size()<(1<<k)){            printf("%d\n",k);            break;        }    }    return 0;}


原创粉丝点击