long int buscabin(int *vetor, long int esq, long int dir, long int key){ /***/ if(TESTE){ long int i; printf("Dentro do buscabin:\n"); printf("Procurando key = %ld, de %ld a %ld\n", key, esq, dir); for(i = esq; i <= dir; i++){ printf("%d ", vetor[i]); } printf("\n"); /*return MAX;<=====================*/ } /***/ if(dir < esq) return MAX; else{ long int meio = (dir - esq)/2 + esq; if(vetor[meio] > key) return buscabin(vetor, esq, meio - 1, key); else if(vetor[meio] < key) return buscabin(vetor, meio + 1, dir, key); else if( vetor[meio - 1] == key) return buscabin(vetor, esq, meio - 1, key); else return meio; } }
int main(void) { int i, pos, caso = 1; while (scanf("%d %d", &N, &Q), N) { for (i = 0; i < N; i++) scanf("%d", &v[i]); qsort(v, N, sizeof(int), &cmp); printf("CASE# %d:\n", caso++); while (Q--) { scanf("%d", &i); if ((pos = buscabin(i)) != -1) printf("%d found at %d\n", i, pos + 1); else printf("%d not found\n", i); }} return 0; }
int main(){ long int n; int entrada[MAX], acumulado[2][MAX], vencedor; long int saida[MAX][2]; char c; long int pontosMax, setsJogador1, setsJogador2, procura; long int fimSetAnterior; long int indice[2]; long int npossibilidades; /*controle*/ long int i; /*Entrada*/ scanf("%ld", &n); /* while(scanf("%c", &c) && c == '\n'); entrada[0] = c - '0'; if(entrada[0] == 1){ acumulado[JOG1][0] = 1; acumulado[JOG2][0] = 0; } else{ acumulado[JOG1][0] = 0; acumulado[JOG2][0] = 1; } */ acumulado[JOG1][0] = 0; acumulado[JOG2][0] = 0; n++; for(i = 1; i < n; i++){ while(scanf("%c", &c) && (c == '\n' || c == ' ')); entrada[i] = c - '0'; if(entrada[i] == 1){ acumulado[JOG1][i] = acumulado[JOG1][i-1] + 1; acumulado[JOG2][i] = acumulado[JOG2][i-1]; } else{ acumulado[JOG1][i] = acumulado[JOG1][i-1]; acumulado[JOG2][i] = acumulado[JOG2][i-1] + 1; } } if(entrada[n-1] == 1){ vencedor = JOG1; pontosMax = acumulado[JOG1][n - 1]; } else{ vencedor = JOG2; pontosMax = acumulado[JOG2][n - 1]; } /***/ if(TESTE){ for(i = 0; i < n; i++){ printf("%d",entrada[i]); } printf("\n"); for(i = 0; i < n; i++){ printf("%d",acumulado[JOG1][i]); } printf("\n"); for(i = 0; i < n; i++){ printf("%d",acumulado[JOG2][i]); } printf("\n"); } /***/ /*Processamento*/ npossibilidades = 0; for(i = pontosMax; i > 0; i--){ /*verifica se jogo de i pontos e valido*/ setsJogador1 = 0; setsJogador2 = 0; fimSetAnterior = 0; while(fimSetAnterior < n - 1){ procura = acumulado[JOG1][fimSetAnterior] + i; indice[JOG1] = buscabin(acumulado[JOG1],fimSetAnterior + 1, n-1, procura); procura = acumulado[JOG2][fimSetAnterior] + i; indice[JOG2] = buscabin(acumulado[JOG2],fimSetAnterior + 1, n-1, procura); /***/ if(TESTE){ printf("indices devolvidos: JOG1:%ld, JOG2:%ld\n", indice[JOG1], indice[JOG2]); } /***/ if(indice[JOG1] < indice[JOG2]){ fimSetAnterior = indice[JOG1]; setsJogador1++; } else{ fimSetAnterior = indice[JOG2]; setsJogador2++; } } if(fimSetAnterior < MAX){ if(setsJogador1 > setsJogador2 && vencedor == JOG1){ insereSaida((long int *)saida,npossibilidades,setsJogador1,i); npossibilidades++; } else if(setsJogador1 < setsJogador2 && vencedor == JOG2){ insereSaida((long int*)saida,npossibilidades,setsJogador2,i); npossibilidades++; } } } /*Saida*/ printf("%ld\n", npossibilidades); for( i = 0; i < npossibilidades; i++){ printf("%ld %ld\n", saida[i][0], saida[i][1]); } /*retorna jogos validos em ordem crescente [sets] [points]*/ return 0; }