Блог пользователя lovro-sinda

Автор lovro-sinda, 12 лет назад, По-английски

The given is N non-negative numbers, select exactly K who provide minimal result of OR operation (binary OR operation).

Input The first line contains an integer N (1 ≤ K ≤ N ≤ 50). The next line contains N integers not exceeding 1000 000 000

Output

Print result of OR operation selected K numbers.

Examples:

entrance

2 2
1 3

output

3

entrance

6 3
5 2 4 1 7 5

output

5

Any ideas how to solve it?

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

»
12 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Where I can submit it?

  • »
    »
    12 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    It is the task form Croatian contest, but if you want to submit you can use this link https://zatemas.zrs.hr/?app=evaluator&evlshw=solver&cd=Bo%C5%BEo%2F2013%2FDrugi+ogled%2F&evlsolve=Ili That link provide you on task at the evaluator. And you must be register to submit solution.

    • »
      »
      »
      12 лет назад, скрыть # ^ |
      Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

      Can you submit this code?

      #define _CRT_SECURE_NO_WARNINGS
      
      #include <stdio.h>
      
      long long ans = 1e18, Min, sum = 1e18, mas[60];
      bool used[60];
      
      int main() {
      	int N, K;
      	scanf("%d%d", &N, &K);
      	for (int i = 0; i < N; i++)
      		scanf("%d", &mas[i]);
      	for (int i = 0; i < N; i++) {
      		for (int j = 0; j < N; j++)
      			used[j] = 0;
      		used[i] = 1;
      		ans = mas[i];
      		for (int j = 0; j < K; j++) {
      			Min = -1;
      			for (int k = 0; k < N; k++) {
      				if (!used[k] && Min == -1)
      					Min = k;
      				else if (!used[k] && (mas[i] | mas[k]) < (mas[i] | mas[Min]))
      					Min = k;
      			}
      			ans |= mas[Min];
      			used[Min] = 1;
      		}
      		if (ans < sum)
      			sum = ans;
      	}
      	printf("%I64d\n", sum);
      	return 0;
      }
      
      • »
        »
        »
        »
        12 лет назад, скрыть # ^ |
        Rev. 2  
        Проголосовать: нравится +6 Проголосовать: не нравится
        1. 16 0.00 OK! Good solution.
        2. 0 0.00 Your program printed "383", but it should be "100".
        3. 0 0.00 Your program printed "10111", but it should be "10000".
        4. 0 0.00 Your program printed "1015805", but it should be "785407".
        5. 0 0.00 Your program printed "1245079", but it should be "1234567".
        6. 0 0.00 Your program printed "13612917", but it should be "12878913".
        7. 0 0.00 Your program printed "62781311", but it should be "12345678".
        8. 0 0.00 Your program printed "1004535807", but it should be "999111222".
        9. 0 0.00 Your program printed "123723101", but it should be "123456789".
        10. 0 0.00 Your program printed "939524095", but it should be "536870911".

        16/160 points

»
12 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

backtracking should be enough if you prune the search when possible.

»
12 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Could you please submit my solution

»
12 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +24 Проголосовать: не нравится

You can do this using a greedy algorithm. Let 2^x be the highest power of two smaller than or equal to the biggest of the integers in the input.

  • If there are less than k numbers with bit x not set (easy case): you will be forced to pick at least one number with bit x set, so answer will have bit x set no matter what you do.

  • If there are k or more numbers with bit x not set: it's always better to ignore all numbers in the input that have bit x set, because by not picking it you always get a smaller answer.

I submitted this solution and it was accepted, but I'll leave the implementation to you.