数组游戏
【问题描述】
题意很简单,给你长度为N的数组 a[i] (i <= N),其中 a[i]不是 1 就是2。
然后给你Q组询问,每次询问一个数x,问是否存在l, r (l <= r)使得
成立,对于每个询问,你只要输出Y(存在)或者 N(不存在)。
【输入格式】
第一行包含两个正整数N、Q,意义见题目描述。
第二行包含n 个正整数,第i个数表示 a[i]。
接下来有Q行,每行有一个正整数x,表示一组询问。
【输出格式】
输出Q行,每行Y或者 N,表示是否存在。
【样例输入】
4 4
1 2 1 2
3
1
4
7
【样例输出】
Y
Y
Y
N
【数据规模及约定】
对于70%的数据,N <= 500,Q<=100
对于90%的数据,N <= 100,000, Q <= 100
对于100%的数据,N<=1,000,000,Q <=1,000,000
对于本题,自然可以暴力过百分之七十,这道题也自然可以找规律。
如果7可以组成,组成7的a[l]和a[r]可能是1,1或2,1或2,2或2,1,可以发现,无论哪种情况,我们
都可以通过去掉边上的数,使拼成5,于是得出结论,小于等于能拼出的最大单数的单数,是可以拼成的,
小于等于能拼出最大双数的双数,也是可以拼成的.
所以,我们可以找出最大单数和最大双数,如果全部想加是单数,那么找出最左边的p,a[p]=1,
和最右边的q,a[q]=1,最大双数=max(a[p+1]...a[N],a[1]+a[2]+...a[q-1]);
1 #include <iostream> 2 #include <fstream> 3 #include <cstdlib> 4 #include <cstring> 5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 6 using namespace std; 7 8 ifstream fin("game.in"); 9 ofstream fout("game.out"); 10 11 int cnt_sum,cnt_he; 12 int zhui[1000005]; 13 14 int main(int argc, char** argv) { 15 fin>>cnt_sum>>cnt_he; 16 int zuo=1000002,you=0; 17 zhui[1000002]=2000002; 18 int shuang=0,dan=0; 19 for(int x=1;x<=cnt_sum;x++){ 20 int a;fin>>a; 21 zhui[x]=zhui[x-1]+a; 22 if(a==1){ 23 zuo=min(x,zuo); 24 you=max(x,you); 25 } 26 } 27 shuang=zhui[cnt_sum]; 28 dan=max(zhui[cnt_sum]-zhui[zuo],zhui[you-1]); 29 if(shuang%2!=0){ 30 int d=shuang; 31 shuang=dan; 32 dan=d; 33 } 34 35 for(int x=1;x<=cnt_he;x++){ 36 int a;fin>>a; 37 if(a%2==0){ 38 if(a<=shuang)fout<<"Y"<<endl; 39 else fout<<"N"<<endl; 40 } 41 else{ 42 if(a<=dan)fout<<"Y"<<endl; 43 else fout<<"N"<<endl; 44 } 45 } 46 47 return 0; 48 }