背包题请拉到最后
问题 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