题解:P9939 [USACO21OPEN] Acowdemia III B

考虑贪心。

遍历每只奶牛:

  • 如果它最多与一头奶牛相邻,那么什么都不会发生。
  • 如果它与两头以上的奶牛相邻,那么它与两侧的两头奶牛相邻。将答案递增 \(1\)
  • 否则,如果正好有两头相邻的奶牛,我们就把它们配对。也就是说,将这对奶牛插入一组。

代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[1010][1010];
const int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
int main(){
    scanf("%d%d",&n,&m);
    map<vector<pair<int,int>>,int> p;
    for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
            if(a[i][j]!='G') continue;
            vector<pair<int,int>>v;
            for(int d=0;d<4;d++){
                int x=i+dx[d],y=j+dy[d];
                if(a[x][y]=='C')v.push_back({x, y});
            }
            if(v.size()<2)continue;
            if(v.size()>2)ans++;
            if(v.size()==2){
                if(v[0]>v[1])swap(v[0],v[1]);
                p[v]=1;
            }
        }
	}
    printf("%d",ans+p.size());
    return 0;
}

posted @ 2024-10-02 17:43  cly312  阅读(65)  评论(0)    收藏  举报