| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哈哈,自己用位运算解出来了,贴一下In Reply To:用位运算应该会很简单,可是不会啊 Posted by:Codievilky at 2012-08-07 09:21:22 哈哈,自己用位运算解出来了,贴一下
#include<iostream>
using namespace std;
int main(){
int n=0;
scanf("%d",&n);
for(int i=0;i<12;i++){
int tip[3]={0xfff,0xfff,0xfff},judgement=0,b[3]={0},left=0,right=0;
int Tleft[3]={0},Tright[3]={0};
char weight[6]={0};
for(int m=0;m<3;m++){
char left[8],right[8],balance[6];
scanf("%s %s %s",left,right,balance);
if(strcmp(balance,"even")!=0){
tip[m]=0;
for(int p=0;p<12;p++){
if(left[p]!=0){
Tleft[m]=Tleft[m]|(1<<(left[p]-'A'));
Tright[m]=Tright[m]|(1<<(right[p]-'A'));
tip[m]=Tleft[m]|tip[m]|Tright[m];
}
else break;
}
if(strcmp(balance,"up")==0)
b[m]=1;
else
b[m]=-1;
}
else{
for(int p=0;p<12;p++){
if(left[p]!=0)
judgement=judgement|(1<<(left[p]-'A'))|(1<<(right[p]-'A'));
else break;
}
}
}
if(tip[0]==0xfff&&tip[1]==0xfff&&tip[2]==0xfff){
int templeft=~0,tempright=~0;
for(int u=0;u<3;u++){
if(b[u]!=0){
templeft=templeft&Tleft[u];
tempright=tempright&Tright[u];
}
}
for(int u=0;u<3;u++){
if(b[u]!=0){
Tleft[u]=Tleft[u]&(~templeft);
Tright[u]&=(~tempright);
}
}
if(judgement!=0){
//tip[0]=tip[0]&(~judgement);
for(int u=0;u<3;u++){
if(b[u]!=0){
Tleft[u]=Tleft[u]&(~judgement);
Tright[u]&=(~judgement);
if(Tleft[u]==0){
b[u]++;
tip[0]=Tright[u];
}
else if(Tright[u]==0){
b[u]--;
tip[0]=Tleft[u];
}
if(b[u]!=0)
strcpy(weight,"light");
else
strcpy(weight,"heavy");
break;
}
}
}
else{
tip[0]=~0;
int temp=b[0]+b[1]+b[2];
left=~0;right=~0;
for(int u=0;u<3;u++){
if(b[u]==temp){
left=Tleft[u]&left;
right=Tright[u]&right;
}
}
tip[0]=left|right;
for(int u=0;u<3;u++){
if(Tleft[u]==tip[0]||Tright[u]==tip[0]){
if(Tleft[u]==tip[0])
b[u]++;
else if(Tright[u]==tip[0])
b[u]--;
if(b[u]==0)
strcpy(weight,"light");
else
strcpy(weight,"heavy");
}
}
}
}
else{
tip[0]=tip[0]&tip[1]&tip[2];
tip[0]=tip[0]&(~judgement);
int wei=0;
for(int m=0;m<3;m++){
if(b[m]==1||b[m]==-1){
int temp=b[m];
left=0;right=0;
left=Tleft[m];
right=Tright[m];
left=left&tip[0];
right=right&tip[0];
if(left>0&&right>0)
continue;
else if(left==0)
temp--;
else if(right==0)
temp++;
if(temp==0){
strcpy(weight,"light");
wei=-1;
}
else {
strcpy(weight,"heavy");
wei=1;
}
}
}
for(int m=0;m<3;m++){
if(b[m]==1||b[m]==-1){
int temp=b[m];
left=0;right=0;
left=Tleft[m];
right=Tright[m];
left=left&tip[0];
right=right&tip[0];
if(left>0&&right>0){
temp=temp+wei;
if(temp==0)
tip[0]=right&tip[0];
else
tip[0]=left&tip[0];
}
}
}
}
int move=0;
while((1<<move)!=tip[0]){
move++;
}
char anwser='A'+move;
printf("%c is the counterfeit coin and it is %s. \n",anwser,weight);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator