# APCS 2019/6 題解 ## ==籃球比賽== ### 題目 [籃球比賽](https://zerojudge.tw/ShowProblem?problemid=e286) ### 核心 迴圈 ### 思路 ```c++= #include<bits/stdc++.h> using namespace std; int main() { int As1=0,Bs1=0,As2=0,Bs2=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { int score; scanf("%d",&score); if(i<2&&i&1) Bs1+=score; else if(i<2) As1+=score; else if(i>=2&&i&1) Bs2+=score; else As2+=score; } } printf("%d:%d\n%d:%d\n",As1,Bs1,As2,Bs2); if(As1>Bs1&&As2>Bs2) printf("Win\n"); else if(Bs1>As1&&Bs2>As2) printf("Lose\n"); else printf("Tie\n"); } ``` ## ==機器人的路徑== ### 題目 [機器人的路徑](https://zerojudge.tw/ShowProblem?problemid=e287) ### 核心 二維陣列、模擬 ### 思路 邊界設為已探過。 ```c++= #include<bits/stdc++.h> using namespace std; #define N 105 #define oo 1000005 #define int long long int a[N][N]; bool visit[N][N]={false}; signed main() { int m,n; scanf("%lld %lld", &m,&n); int imax=oo; int si,sj,i,j; int di[4]={0,1,0,-1},dj[4]={1,0,-1,0}; for(j=0; j<=n+1; j++) visit[0][j]=true,visit[m+1][j]=true; for(i=0; i<=m+1; i++) visit[i][0]=true,visit[i][n+1]=true; for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { scanf("%d",&a[i][j]); if(a[i][j]<imax) { imax=a[i][j],si=i,sj=j; } } } int total=0; while(true) { total+=a[si][sj]; visit[si][sj]=true; imax=oo; for(int dir=0; dir<4; dir++) { int ni=si+di[dir],nj=sj+dj[dir]; if(!visit[ni][nj]&&a[ni][nj]<imax) { i=ni,j=nj,imax=a[ni][nj]; } } if(imax==oo) break; si=i,sj=j; } printf("%lld\n",total); } ``` ## ==互補CP== ### 題目 [互補CP](https://zerojudge.tw/ShowProblem?problemid=e288) ### 核心 map、位元 ### 思路 這題後25%真的搞到我了,百思不得其解,後來查了一下才知道要用unorder_map。 還有 all=(((long long)1)<<m)-1,1要先設為long long。 團隊可以邊存邊找,這樣也剛好不會重複計算。 ```c++= #include<bits/stdc++.h> using namespace std; int cvt(char c) { return c<='Z'?c-'A':c-'a'+26; } int main() { unordered_map<long long,int> M; int n,m; scanf("%d%d",&m,&n); long long all=(((long long)1)<<m)-1,ans=0; for(int i=0;i<n;i++) { char str[1005]; scanf("%s",str); long long we=0; for(int j=0;j<strlen(str);j++) we|=(long long)1<<cvt(str[j]); M[we]++; ans+=M[we^all]; } printf("%lld\n",ans); } ``` ## ==美麗的彩帶== ### 題目 [美麗的彩帶](https://zerojudge.tw/ShowProblem?problemid=e289) ### 核心 sliding window、string、map ### 思路 要注意數字大小到10^150^,故用string。 ```c++= #include<bits/stdc++.h> using namespace std; unordered_map<string,int> M; int cnt=0,ans=0; int main() { ios::sync_with_stdio(0),cin.tie(0); int m,n; cin>>m>>n; string ribbon[n]; for(int i=0;i<n;i++) cin>>ribbon[i]; for(int i=0;i<m;i++) { if(M[ribbon[i]]==0) cnt++; M[ribbon[i]]++; } if(cnt==m) ans++; for(int i=m;i<n;i++) { if(M[ribbon[i]]==0) cnt++; M[ribbon[i]]++; if(M[ribbon[i-m]]==1) cnt--; M[ribbon[i-m]]--; if(cnt==m) ans++; } cout<<ans<<endl; } ```