『CCF题解』2014年12月【A】【B】【C】【D】

  1. 门禁系统【基础】

    思路:map标记,map输出。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    map<int,int> mp;
    int main(void){
        int n;
        cin >> n;
        int a[n];
        for(int i = 1; i <= n; i++){
            cin >> a[i];
            mp[a[i]]++;
            a[i] = mp[a[i]];
            cout<<a[i]<<" ";
        }
        cout<<endl;
        return 0;
    }
    
  2. Z字形扫描【规律+模拟】

    思路:模拟,发现每一次斜着走的坐标值和是定值,模拟即可。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 510;
    int a[maxn][maxn];
    int main(void){
    	int n;
    	cin >> n;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++) cin >> a[i][j];
    	cout<<a[1][1]<<" ";
    	bool flag = 1;
    	for(int sum = 3; sum <= n*2; sum++){
    		if(flag){
    			for(int i = 1; i < sum; i++)
    				if(sum-i<=n&&i<=n) cout<<a[i][sum-i]<<" ";
    			flag = 0; 
    		}
    		else{
    			for(int i = 1; i < sum; i++)
    				if(sum-i<=n&&i<=n) cout<<a[sum-i][i]<<" ";
    			flag = 1;
    		}
    	} 
    	return 0;	
    } 
    
    
  3. 集合竞价【模拟】

    思路:

    AC代码:

  4. 最优灌溉【MST模板】

    思路:裸最小生成树

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+10;
    int f[maxn];
    int n,m;
    void Init(){
    	for(int i = 1; i <= maxn; i++) f[i] = i;
    }
    int getf(int x){
    	return x==f[x]?x:f[x] = getf(f[x]);
    }
    struct Node{
    	int u,v,w;
    }node[maxn];
    bool cmp(Node a, Node b){
    	return a.w < b.w;
    }
    int main(void){
    	cin >> n >> m;
    	int sum = 0;
    	Init();
    	for(int i = 1; i <= m; i++) cin >> node[i].u >> node[i].v >> node[i].w;
    	sort(node+1,node+1+m,cmp);
    	for(int i = 1; i <= m; i++){
    		int u = getf(node[i].u);
    		int v = getf(node[i].v);
    		if(u!=v){
    			sum += node[i].w;
    			f[u] = v;
    		}
    	}
    	cout<<sum<<endl;
    	return 0;
    }
    
发布了14 篇原创文章 · 获赞 4 · 访问量 1623

猜你喜欢

转载自blog.csdn.net/wxd1233/article/details/105641132