Codeforces 347B - Fixed Points

题意:给定一个序列,现有一种操作:两个数的位置互换。问最多操作一次,序列 [元素位置i]  与 [元素Ai] 相等的最多个数?

根据题意,最多个数为 :

【操作之前[元素位置i]  与 [元素Ai] 相等的个数】 +  【调换两个 [元素位置i]  与 [元素Ai] 不相等 的元素 使某个 [元素位置i]  与 [元素Ai] 相等的个数】。

举个例子:

0 1 2 4 3

这个序列,调换后面两个元素,正好使每个 [元素位置i]  与 [元素Ai] 相等

也就是说,调换的时候,不用考虑 [元素位置i]  与 [元素Ai] 相等 的元素了。

直接考虑 [元素位置i]  与 [元素Ai] 不相等 的元素中,能否调换一次之后使 一个 或 两个元素[元素位置i]  与 [元素Ai] 相等

调换后若有1个元素 [元素位置i]  与 [元素Ai] 相等

那么最多个数 = 【操作之前[元素位置i]  与 [元素Ai] 相等的个数】 + 1,若有2个元素则 + 2。

接下来就可以根据这个用map来解决这个问题了。

#include <stdio.h>
#include <map>
using namespace std;
int main()
{
    int n, ans;
    while(~scanf("%d", &n))
    {
        map<int, int> mm;
        ans = 0;
        for(int i = 0; i < n; i++)
        {
            int temp;
            scanf("%d", &temp);
            if(temp == i)
            {
                ++ans;
            }
            else
            {
                mm[i] = temp;
            }
        }
        map<int, int>::iterator it = mm.begin();
        for(;it != mm.end();it++)
        {
            if(mm.find((*it).second) != mm.end() && mm[(*it).second] == (*it).first)
            {
                ++ans;
                break;
            }
        }
        if(ans != n)
            ++ans;
        printf("%d\n", ans);
    }
    return 0;
}

Codeforces 347B - Fixed Points

时间: 2024-10-17 15:09:32

Codeforces 347B - Fixed Points的相关文章

CodeForces 347B Fixed Points (水题)

题意:给定 n 数,让你交换最多1次,求满足 ai = i的元素个数. 析:很简单么,只要暴力一遍就OK了,先把符合的扫出来,然后再想,最多只能交换一次,也就是说最多也就是加两个,然后一个的判,注意数组越界. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <cstring> using namespace st

Codeforces 1000C Covered Points Count

C. Covered Points Count题目大意:有n条线段,问有多少个点被i条线段覆盖(i=1~n).很常见的线段覆盖套路题QAQ.坐标排序后把左端点当做+1,右端点当做-1,扫一遍统计答案即可.但是记得开ll,数组大小开双倍. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <queue> 6 #

Codeforces C Match Points

题目描述: Match Points time limit per test 2 seconds memory limit per test 256 mega bytes input standard input output standard output You are given a set of points x1, , ..., *x**n* Two points iand jcan be matched with each other if the following conditi

codeforces 430 A Points and Segments (easy)

题意:给出n个点,m个区间,需要给这些点涂上蓝色或者红色,使得每个区间里面的点的红色的点的个数与蓝色的点的个数的差值小于1 唉,题目的标题就标注了一个easy= = 最开始做的时候对点还有区间都排序了,模拟来做,可是错了 后来发现不管区间怎么样,只要红色和蓝色交替涂色, 就一定能满足“使得每个区间里面的点的红色的点的个数与蓝色的点的个数的差值小于1 ”这个条件 有点像上次做的cf交替输出奇数偶数那个A题 1 #include<iostream> 2 #include<cstdio>

codeforces 340E Iahub and Permutations(错排or容斥)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Iahub and Permutations Iahub is so happy about inventing bubble sort graphs that he's staying all day long at the office and writing permutations. Iahubina is angry that she is no more import

(简单) CF 44D Hyperdrive,数学。

In a far away galaxy there are n inhabited planets, numbered with numbers from 1 to n. They are located at large distances from each other, that's why the communication between them was very difficult until on the planet number 1 a hyperdrive was inv

2015 北京网络赛 E Border Length hihoCoder 1231 树状数组 (2015-11-05 09:30)

#1231 : Border Length 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Garlic-Counting Chicken is a special species living around the Lake of Peking University. A Garlic-Counting Chicken always flies out from home in the morning, goes to some fixed points looki

Gym 100971B 水&amp;愚

Description standard input/output Announcement Statements A permutation of n numbers is a sequence of integers from 1 to n where each number is occurred exactly once. If a permutation p1, p2, ..., pn has an index i such that pi = i, this index is cal

EM算法概念

EM算法是一种非常经典的alternative optimizing算法.alternative optimizing的思想就是对于一个最优化问题,可以计算分为两步或者参数分为两个,就可以随机任意的选择一个起始值或位置,固定一个参数A,以另一个参数B进行优化,然后固定参数B,以参数A进行优化,直到收敛未知.前面博文中所讲述的K-means也就这样的一个过程,或者meanshift均值漂移也是这样的一个思想.今天学习的一个算法也是这样一个概念.这里依然做一个入门级的概念理解指导,不做原理性的深入,