[codeforces 1300C] Anu Has a Function 位运算+打表找规律+最高位开始同位中只有1个1的数摆第1个即可
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1300/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Anu Has a Function | GNU C++11 | Accepted | 62 ms | 200 KB |
手枚几组数据,发现不熟练,找的规律不可靠。
进入打表找规律,这样的规律可靠。
以下为打表代码
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100010],n;
int cmp(int a,int b){
return a>b;
}
int f(int x,int y){
return (x|y)-y;
}
int main(){
int i,l;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
l=a[1];
for(i=2;i<=n;i++){
l=f(l,a[i]);
printf("i=%d l=%d\n",i,l);
}
printf("%d\n",l);
return 0;
}
研究的第一组数据如下
该处结论是手枚加打表得到的结果
11 1011
6 0110
4 0100
0 0000
11 1...
6 0...
4 0...
0 0...
最高位开始同位中只有1个1的数摆第1个即可
该例子中,只需11放第1位即可。
4 11 6 4 0
i=2 l=9
i=3 l=9
i=4 l=9
9
4 11 6 0 4
i=2 l=9
i=3 l=9
i=4 l=9
9
4 11 4 6 0
i=2 l=11
i=3 l=9
i=4 l=9
9
4 11 4 0 6
i=2 l=11
i=3 l=11
i=4 l=9
9
4 11 0 6 4
i=2 l=11
i=3 l=9
i=4 l=9
9
4 11 0 4 6
i=2 l=11
i=3 l=11
i=4 l=9
9
4 6 11 4 0
i=2 l=4
i=3 l=0
i=4 l=0
0
4 4 11 6 0
i=2 l=4
i=3 l=0
i=4 l=0
0
4 0 11 6 4
i=2 l=0
i=3 l=0
i=4 l=0
0
研究自个造出的数据3 6 4 3
该处结论是手枚加打表得到的结果
6 110
4 100
3 011
6 ..0
4 ..0
3 ..1
最高位开始同位中只有1个1的数摆第1个即可
该例子中,只需3放第1位即可。
3 6 4 3
i=2 l=2
i=3 l=0
0
3 6 3 4
i=2 l=4
i=3 l=0
0
3 4 6 3
i=2 l=0
i=3 l=0
0
3 4 3 6
i=2 l=4
i=3 l=0
0
3 3 6 4
i=2 l=1
i=3 l=1
1
3 3 4 6
i=2 l=3
i=3 l=1
1
以下是AC代码。
#include <stdio.h>
int a[100010];
int main(){
int n,i,j,cnt,k,t;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(j=30;j>=0;j--){
cnt=0;
for(i=1;i<=n;i++)
if((a[i]>>j)&1)cnt++,k=i;
if(cnt==1)break;
}
if(cnt==1)t=a[1],a[1]=a[k],a[k]=t;
printf("%d",a[1]);
for(i=2;i<=n;i++)printf(" %d",a[i]);
printf("\n");
}