生活随笔
收集整理的這篇文章主要介紹了
算法学习之路|称量硬币(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有一堆硬幣,其中有一枚是假的,可能更輕也可能更重,用天平在兩邊放上相同數量的硬幣,找出假幣。
輸入格式:第一行兩個數N,K,表示硬幣數和稱量次數。接下來2K行,第一行第一個數表示天平兩邊硬幣個數n,后2n個數為兩邊硬幣編號,第二行為>,<或=符號
輸出格式:如果不能判斷哪個硬幣是假的,輸出0,能就輸出硬幣編號。
輸入樣例:
5 3
2 1 2 3 4
<
1 1 4
=
1 2 5
=
輸出樣例:
3
解題思路:用equal數組標記沒問題的硬幣(兩邊重量相同則硬幣一定都是合格的)
用l和h數組分別標記稱量出較輕和較重的硬幣,l和h標記相等的說明硬幣出現在輕的一側和重的一側的次數相等,硬幣是合格的,否則是不合格的。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,k,equ[1050],l[1050],h[1050],flag[1050],tmp[1050];
int main()
{scanf("%d%d",&n,&k);memset(equ,0,sizeof(equ));memset(l,0,sizeof(l));memset(h,0,sizeof(h));memset(tmp,0,sizeof(tmp));for (int i=1;i<=k;i++){int x;char ch;scanf("%d",&x);for(int j=0;j<2*x;j++)scanf("%d",&tmp[j]);ch=getchar();while(ch!='=' && ch!='<' && ch!='>'){ch=getchar();}if(ch=='<'){for(int j=0;j<x;j++)l[tmp[j]]=1;for(int j=x;j<2*x;j++)h[tmp[j]]=1;for(int j=1;j<=n;j++){bool flag=true;for(int k=0;k<2*x;k++)if(j==tmp[k]){flag=false;break;}if(flag)equ[j]=1;}}else if(ch=='='){for(int j=0;j<2*x;j++)equ[tmp[j]]=1;}else if(ch=='>'){for(int j=0;j<x;j++)h[tmp[j]]=1;for(int j=x;j<2*x;j++)l[tmp[j]]=1;for(int j=1;j<=n;j++){bool flag=true;for(int k=0;k<2*x;k++)if(j==tmp[k]){flag=false;break;}if(flag)equ[j]=1;}}}int ans,cnt=0;for(int i=1;i<=n;i++){if(equ[i])continue;if(l[i]&&h[i])continue;ans=i;cnt++;}if(cnt>1)printf("0\n");elseprintf("%d\n", ans);return 0;
}
總結
以上是生活随笔為你收集整理的算法学习之路|称量硬币(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。