B. Dima and a Bad XOR(异或+思维)

题目链接:

https://codeforces.com/problemset/problem/1151/B

题目大意:

给你一个n*m的矩阵,每一行你可以选一个数,在每一行都选数的前提下,问你能不能能使每一行选的这些数的异或值不是0,如果存在的话,输出这些下标。

具体思路:

首先我们把第一列异或起来,判断这一列的异或起来的值是不是0,如果不是0的话,直接输出;否则对于每一行,找到一个不和这一行第一个不相等的数,找到就立即停。如果找不到就是凑不出来。

具体证明:

如果每一行找不到的话,就说明每一行的数是相同的,也就是无论你怎么选,结果都是相同的。得证

这题思路属实nb

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 const int maxn = 550;
 5 const ll mod = 1e9+7;
 6 int a[maxn][maxn];
 7 int main()
 8 {
 9     int n,m;
10     scanf("%d %d",&n,&m);
11     for(int i=1; i<=n; i++)
12     {
13         for(int j=1; j<=m; j++)
14         {
15             scanf("%d",&a[i][j]);
16         }
17     }
18     int flag=1;
19     int ans=0;
20     for(int i=1; i<=n; i++)
21     {
22         ans^=a[i][1];
23     }
24     if(ans)
25     {
26         printf("TAK\n");
27         for(int i=1; i<=n; i++)
28         {
29             printf("1 ");
30         }
31         printf("\n");
32     }
33     else
34     {
35         int pos=-1;
36         int tmp=0;
37         for(int i=1; i<=n; i++)
38         {
39             int k=0;
40             for(int j=2; j<=m; j++)
41             {
42                 if(a[i][j]!=a[i][1])
43                 {
44                     pos=i;
45                     tmp=j;
46                     k=1;
47                     break;
48                 }
49             }
50             if(k)
51                 break;
52         }
53         if(pos==-1)
54         {
55             printf("NIE\n");
56         }
57         else
58         {
59             printf("TAK\n");
60             for(int i=1; i<=n; i++)
61             {
62                 if(i==pos)
63                     printf("%d ",tmp);
64                 else
65                     printf("1 ");
66             }
67             printf("\n");
68         }
69 
70     }
71     return 0;
72 }

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10982251.html