zoukankan      html  css  js  c++  java
  • Fixed Points (Codeforces Round #201 (Div. 2))

    题目链接:http://codeforces.com/contest/347/problem/B

    题意:给定n个各不相同的数,若i = a[i]即第i个位置a[i]的数值为i则称该点为fixed point,对于给定的n个数,最多交换两个数的位置,求该数列可能有的最多的fixed points的值。

    思路:两个for循环扫会超时,所以只能扫一次。另开一个vis数组,以和下标不一样的数字为下标储存这个数字的下标,即vis[a[i]] = i, 这样在扫一次的时候只要判断vis[i]是否等于a[i],就可以知道交换这两个数字能不能增加两个fixed points。既然记录了错位的数字错在哪个下标,那么扫一次的时候直接利用这个下标去看数字就行了。
     

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    const int N = 100005;
    int a[N], vis[N];
     
    int main()
    {
    	int n, cnt = 0, ans = 0;
    	bool ok = false;
    	scanf("%d", &n);
    	for(int i = 0; i < n; i++) {
    		scanf("%d", &a[i]);
    		if(a[i] != i) {
    			ok = true;
    			vis[a[i]] = i;
    		}
    		else
    			ans++;
    	}
    	if(!ok)
    		printf("%d
    ", ans);
    	else {
    		bool flag = false;
    		for(int i = 0; i < n; i++) {
    			if(a[i] != i) {
    				if(vis[i] == a[i]) {
    					flag = true;
    					break;
    				}
    			}
    		}
    		if(flag)
    			printf("%d
    ", ans+2);
    		else
    			printf("%d
    ", ans+1);
    	}
    	return 0;
    }
  • 相关阅读:
    四十八.监控概述 、 Zabbix基础 、 Zabbix监控服务
    123D
    bzoj3879
    bzoj1699
    LA6878
    uoj#149
    687C
    codeforces round #424 div2
    803E
    713C
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089017.html
Copyright © 2011-2022 走看看