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;
    }
  • 相关阅读:
    python打印4个九九乘法表
    mysql语法归纳总结
    帆软BI报表的创建
    jmeter+influxdb+grafana可视化监控接口测试
    jmeter 自动化
    linux安装docker+jmeter分布式
    jmeter连接mysql数据库
    cmd切换盘符
    jmeter接口测试教程
    python3 进程中 获取进程号和杀死进程
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089017.html
Copyright © 2011-2022 走看看