題意:給你n種貨幣,再給你m種保證每個貨幣能換成其他的貨幣,其中 兩個貨幣之中給你它們的匯率。要你求出能不能找到一種兌換的方式,使得最後兌換為起始的貨幣,使得自己賺錢了
思路:這個題目也是一個建圖的模型。可以假設出,從某點出發,回到原點,自己的價值還增大了,所以只需要匯率的乘積到起始點的時候大於1就可以了。所以,明顯的Floyd算法。
AC代碼:
#include #include #include #include #include using namespace std; double str[31][31]; maphash;//用映射可以找到簡單情況時是否成立 //還可以把貨幣點轉化為特定的數字,比如RMB可以作為1號錢幣 int n,m; void Floyd() { int i,j,k; double flag=-1; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { str[i][j]=max(str[i][j],str[i][k]*str[k][j]); } for(i=1;i<=n;i++) flag=max(flag,str[i][i]); if(flag>1)printf("Yes\n"); else printf("No\n"); } int main() { int i,j,k; int cnt=1; char s[31]; while(scanf("%d",&n)!=EOF) { getchar(); int tot,flag; if(n==0)break; memset(str,0,sizeof(str)); hash.clear(); //沒初始化就錯了 flag=tot=0; for(i=1; i<=n; i++) { scanf("%s",s); if(!hash[s]) hash[s]=++tot;//將貨幣給一個代號 } scanf("%d", &m); for(i= 1; i<=m;i++) { double a; char str1[31], str2[31]; scanf("%s%lf%s",str1,&a,str2); int x=hash[str1]; int y=hash[str2]; str[x][y]=a; if(x==y&&a>1)flag=1; } printf("Case %d: ",cnt++); if(flag) printf("Yes\n"); else Floyd(); } return 0; }
Cocos2d-x開發中C++內存管理 由於開始並沒有介
c++獲取sqlite3數據庫表中所有字段的方法,sqlit
Hanoi Tower Troubles Again!
也說_T、_TEXT、TEXT、L,_t_text本片文章轉
c++中stl容器的常用示例,stl容器示例1、
SICP 習題 1.37是一條很長的題目,主要講的是無