POJ 1029 判断假币

题意:给你编号为1到n个钱币,其中有一个是假的,k次称量结果,判断并输出假币的编号,不能判断输出0。

分析:

1.等号‘=’两边全为真币。

2.假币不可能既偏重又偏轻。

3.几次不等的称量假币就出现几次。

AC代码:

#include<stdio.h>
#include<string.h>
#define max 1003

int mark[max];
struct node
{
      int s;
      char c[3];
      int a[max>>1],b[max>>1];
}nod[103];

int main()
{
      int n,k;
      int i,j,l;
      int t,x,x1,x2;
      int eq;//等式的数量;
      while(~scanf("%d%d",&n,&k))
      {
            memset(mark,0,sizeof(mark));
            eq=0;
            //输入;
            for(i=0;i<k;i++)
            {
                  scanf("%d",&nod[i].s);
                  for(j=0;j<nod[i].s;j++)
                        scanf("%d",&nod[i].a[j]);
                  for(j=0;j<nod[i].s;j++)
                        scanf("%d",&nod[i].b[j]);
                  scanf("%s",nod[i].c);
                  //记录相等的情况;
                  if(nod[i].c[0]=='=')
                  {
                        for(j=0;j<nod[i].s;j++)
                              mark[nod[i].a[j]]=mark[nod[i].b[j]]=1;
                        eq++;
                  }
                  else if(nod[i].c[0]=='<')
                  {
                        //不相等则变为一种情况;都变为 > 。
                        for(j=0;j<nod[i].s;j++)
                        {
                              t=nod[i].a[j];
                              nod[i].a[j]=nod[i].b[j];
                              nod[i].b[j]=t;
                        }
                        nod[i].c[0]='>';
                  }
            }
            t=0;
            for(i=1;i<=n;i++)
                  if(mark[i]==0)
                  {
                        x1=x2=0;
                        for(j=0;j<k;j++)
                        if(nod[j].c[0]=='>')
                        {
                              for(l=0;l<nod[j].s;l++)
                              {
                                    if(nod[j].a[l]==i)
                                    x1++;
                                    if(nod[j].b[l]==i)
                                    x2++;
                              }
                        }
                        if(x1&&x2)//假币不可能既偏重又偏轻;
                              mark[i]=1;
                        else if(x1==k-eq&&x2==0||x1==0&&x2==k-eq)
                        {
                              //满足这个才可能是假币;
                              t++;
                              x=i;
                        }
                  }
            if(t==1)
                  printf("%d\n",x);
            else
                  printf("0\n");
      }
      return 0;
}
时间: 2024-10-14 20:50:53

POJ 1029 判断假币的相关文章

poj 1029 false coin

题目大意:就是一堆硬币中有一个假硬币,然后再给你几个天平的状态求出是否能找出哪个是假硬币并打印出编号. 主要思路: 可以使用穷举法.穷举1--n个硬币,分别判断是否是有问题的硬币(即假设该硬币有问题,是否与已知的天平判断结果一致),当然试探要分两种情况:重量轻了.重量重了.若全部试探完后发现:若个数为1,则说明有问题的硬币就是该硬币:否则说明有问题的硬币可能超过2个,则说明不能判断到底硬币是哪个. 主题思路清晰后,接下来就是如何判定是否与天平测试结果相一致.其实非常简单: 1)若为轻的情况. 1

poj 1679 判断最小生成树是否唯一

/* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct node { int u,v,w; }f[N*N*2]; int cmp(const void *a,const void*b) { return (*(struct node *)a).w-(*(struct node *)b).w; } int pre[N]; int find(int x) { if(x

半平面交 模板 poj 3335 poj 3130 poj 1474 判断半平面交是否为空集

半平面交模板 const double pi= acos(-1.0); #define arc(x) (x / 180 * pi) const double EPS = 1e-8; const int Max_N = 105; struct Point{ double x,y; Point(){} Point(double x, double y):x(x),y(y){} Point operator - (Point p){ return Point(x- p.x , y - p.y ) ;

POJ 2762判断单联通(强连通缩点+拓扑排序)

Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14789   Accepted: 3915 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors

Poj 1029

传送门 判断假硬币,前面好像有道类似的题(Poj 1013),这个题比之前那个多了一个可能有无法判断的情况 1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 6 char C; 7 int N,K;//1000 100 8 int P; 9 int maxx; 10 bool flag; 11 int coin[1005]; 12 int Left[50

POJ 1410 判断线段与矩形交点或在矩形内

这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 using namespace std; const int maxn=100; typedef struct Point {

A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&amp;判断点在多边形内&amp;判断圆在多边形内)

题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内. 分析:判断凸多边形可以使用相邻的三个点叉积判断,因为不知道顺时针还是逆时针,所以叉积如果有有整数和负数,那么一定不是凸多边形(注意允许多多点在一条线段上).判断圆在凸多边形首先要判断圆心是否在多边形内,如果在多边形内,再次判断圆心到达到变形每条边的最短距离,如果小于半径就是不合法.ps:一道好题,通过这个题学会了不少东西.

poj 1679 判断MST是不是唯一的

判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique! 先求出最小的权值和 然后一条边一条边的删先标记MST中所使用的边 删边就是屏蔽这条边后 再对剩下的边求MST 如果最后的权值和 与开始算出的最小的那个 相等 就说明不是唯一的 Sample Input 2 //T3 3 //n m1 2 1// u v w2 3 23 1 34 41 2 22 3 23 4 24 1 2Sample Output 3Not Unique! Kruskal 1

POJ 2074 /// 判断直线与线段相交 视野盲区

题目大意: 将所有物体抽象成一段横向的线段 给定房子的位置和人行道的位置 接下来给定n个障碍物的位置 位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的 求最长的能看到整个房子的一段人行道的长度 若不在 y(房子)和y(人行道)之间的 不会有视野的阻碍 注意边界处理 因为盲区可能包含在人行道内 也可能超出 #include <cstdio> #include <algorithm> #include <cmath> using namespace st