金币问题

来源:互联网 发布:山田优 知乎 编辑:程序博客网 时间:2024/06/11 02:41

问题 假金币
      Gold Bar银行收到可靠消息:在M组金币中每组都有一个重量不同的假金币(其他金币的重量相同)。经济危机之后他们只有一台天平可用。用这台天平,可以称量出左边托盘中的物体是轻于、重于或等于右边托盘中的物体。
  为了分别出假金币,银行职员将所有的金币编为1-N号。然后用天平称量不同的金币组合,每次仔细记载称量金币的编号和结果。
  现在要求编写一个程序,帮助银行职员根据称量记录找出假金币的编号。

  输入:
  第一行为金币组数M,后面是每组金币情况。
  第二行输入两个空格隔开的整数N和K,N是金币的总数(2<=N<=1000),K是称量的次数(1<=K<=100)。随后的2K行记录称量的情况和结果,连续两行记录一次称量:第1行首先是Pi(1<=Pi<=N/2) ,表示两边托盘中放置的金币数目,随后是左边托盘中Pi个金币编号和右边托盘中Pi个金币编号,所有的数之间都由空格隔开;第2行用<,>,=和记录称量结果。
<表示左边托盘中的金币比右边的轻
 >表示左边托盘中的金币比右边的重
 =表示左右两边托盘中的金币一样重
 
 输出
 输出假金币的编号。如果根据称量记录无法确定假金币,输出0。

输入样例
 1
 5 3
 2 1 2 3 4
 <
 1 1 4 
 =
 1 2 5
 =
 输出样例
 3

 

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
 int group_num,total_gold_num,weight_num,gold_num,current_gold_num,temp;
 int i,j,k,x;
 int in_flag; //穷举金币存在标志
 int false_gold,false_gold_num,false_gold_temp;
 char sign;
 vector<int> v1;
 vector<int> v2;
 vector<char> v3;

 
 //打开文件
 ifstream filein("input.txt");

 //读取总组数
 filein >> group_num;

 
 for (i=0;i<group_num;i++)
 {
  //读取每组的金币总数
  filein >> total_gold_num;
  
  false_gold_num=0;

  //清零v1,v2,v3
  v1.clear();
  v2.clear();
  v3.clear();


  //读取每组的称量次数
  filein >> weight_num;
  
  for (j=0;j<weight_num;j++)
  {
   //读取每次称量金币数量
   filein >> gold_num;
   
   v1.push_back (gold_num);

   for (k=0;k<2*gold_num;k++)
   {
    filein >> current_gold_num;
    v2.push_back(current_gold_num);
   }

   filein >> sign;
   v3.push_back(sign);
  }
  
  
  //穷举所有金币
  for (j=1; j<=total_gold_num; j++)
  {
   false_gold_temp=j;
    
   for (k=0;k<weight_num;k++)
   {
    if (false_gold_temp!=0)
    {
     in_flag = 0;
     if (k==0)
      temp = 0;
     else
      temp = temp + v1[k-1]*2;

     for (x=0;x<2*v1[k];x++)
     {
      
      if (j == v2[x+temp])
      {
       in_flag = 1;
       break;
      }
     }

     //如果没有x号金币,而天平不平衡,或者有x号金币而天平平衡,则x号金币不是假金币
     if (((in_flag==0) && (v3[k]!='=')) || ((in_flag==1) && (v3[k]=='=')))
     {
      false_gold_temp=0;
     }
    }
   }
   if (false_gold_temp!=0)
   {
    false_gold_num++;
    false_gold=false_gold_temp;
   }
  }
  if (false_gold_num==1)
   cout << false_gold << endl;
  else
   cout << 0 << endl;
 }
 

 
 //关闭文件
 filein.close();
 return 0;

}