buct2018年程序设计实训作业一部分题目解答

背包题请拉到最后
问题 A: 不同的数字(easy)

题目描述
对于一个长度为n的数组a_1,a_2,...,a_n
你将会得到m次询问,每次询问给出l,r,你需要计算出a_l,a_(l+1),...,a_r中有多少个不同的数字
如1,2,2,3,3中有3个不同的数字,分别是1,2,3
输入
输入第一行两个整数n(1<=n<=100),代表数组长度,m(1<=m<=100),代表询问个数
第二行有n个数字,代表给定的数组.(1<=a_i<=1e6)
接下来m行,每行给出一个l,r,代表询问.(1<=l<=r<=n)
输出
对于每个询问输出一行,每行一个整数,代表区间内不同数字的个数.

样例输入
5 3
1 1 2 1 3
1 5
2 4
3 5
样例输出
3
2
3 

用一个数组记录数据,每次查询可以通过桶排达成0n的时间复杂度,对于本体时间足够了(水题)

#include<bits/stdc++.h>
using namespace std;
int a[105],b[1000005];
int main()
{
    int n,m;memset(b,0,sizeof(b));
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        int cnt=r-l+1;

        for(int i=l;i<=r;i++)
        if(b[a[i]]==1)cnt--;
        else b[a[i]]=1;
        cout<<cnt<<endl;
        for(int i=l;i<=r;i++)
        b[a[i]]=0;
    }
}

问题 C: 简单的数列问题

题目描述
有这么一个数列g,g[i]=g[i-1]+i,g[1]=1
这个数列的前几项依次是 1 3 6
现在有m个询问,每个询问给出一个a,你需要判断a是否存在于这个数列中
输入
第一行给出一个m,(m<=1e5),代表询问的次数
接下来m行每行一个整数a,(a<=1e9)
输出
对于每个询问输出"YE5"或者"N0"(不含引号),当a存在于数列g中时,输出"YE5",否则输出"N0"
每次输出占一行
样例输入
6
1
2
3
4
5
6
样例输出
YE5
N0
YE5
N0
N0
YE5

数列为1+2+3。。。即n(n+1)/2。对于给定的数字乘二之后便是n(n+1)。由于对整形求根之后会省略小数,所以求根得到n。然后判定n(n+1)是否等于原数乘二即可。
还有,输出的N0和YE5。结尾分别是0和5。

#include<bits/stdc++.h>
using namespace std;
long long k;
int main()
{
    int m;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%lld",&k);
        k<<=1;
        long long t=sqrt(k);
        if(t*(t+1)==k)p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值