TopCoder 636 B 【暴力】

题意:给出一个排列,其中的一些数字不小心给擦掉了。但是知道这个序列满足 i < j && a[ i ] < a[ j ] 的元素对有n个,然后让你求还原这个排列之后有几个排列是满足条件的

分析:很简单很暴力,暴力填入擦掉的值,然后看有多少对元素,然后比较就好。

代码:

#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define PB push_back
#define MP make_pair

#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)

typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;

class SortishDiv2
{
        public:
        int ways(int sortedness, vector <int> seq)
        {
            int ans = 0;
            int vis[200],dis[200];
            int pps[200];
            memset(vis,0,sizeof(vis));
            memset(dis,0,sizeof(dis));
            for(int i=0;i<seq.size();i++)
            {
                dis[seq[i]]=1;
                if(seq[i]==0)
                {
                    vis[i]=1;
                    continue;
                }
                for(int j=i+1; j<seq.size();j++)
                {
                    if(seq[i]==0)
                        continue;
                    if(seq[i]<seq[j])
                        ans++;
                }
            }
            sortedness -= ans;
            int count = 0;
            vector<int> cc,wei;
            for(int i=1;i<=seq.size();i++){
                if(dis[i]==0){
                    cc.push_back(i);
                }
                if(vis[i-1])
                    wei.push_back(i-1);
            }
            if(cc.size()==0)
                return sortedness==0;
            do
            {
                ans = 0;
                for(int i=0;i<seq.size();i++)
                    pps[i] = seq[i];
                for(int i = 0;i<wei.size();i++)
                {
                    for(int k=0;k<seq.size();k++)
                    {
                        if(pps[k]==0)
                            continue;

                        if(k>wei[i] && pps[k]>cc[i] || k<wei[i] && pps[k]<cc[i]){
                            ans++;
                        }
                    }
                    pps[wei[i]]=cc[i];
                }
                if(ans == sortedness)
                    count++;
            }while(next_permutation(cc.begin(),cc.end()));
            cc.clear();
            wei.clear();
            return count;
        }
};

int main()
{
    freopen("Input.txt","r",stdin);
        SortishDiv2 a;
        int n;
        vector<int> v;
        while(~scanf("%d",&n))
        {
            for(int i=0;i<n;i++)
            {
                int x;
                scanf("%d",&x);
                v.push_back(x);
            }
            cout<<a.ways(n,v)<<endl;
            v.clear();
        }
        return 0;
}
时间: 2024-11-05 14:43:24

TopCoder 636 B 【暴力】的相关文章

Topcoder SRM 630 (500 floyed 暴力 _builtin_popcount())

题意:给n个点,保证图联通,给点相连的距离,求一个最多的点,这些点之间的距离都是相同的. 分析: 下面的代码是我们房间第一的大神的,写的很简洁,我的思路和他的一样,但是我不知道错哪了. 思路是暴力枚举,最多有10个点,先用floyed计算出每两点之间的距离,然后用位运算暴力枚举, 枚举每个点是否加入进去,并用set把每个加入进去的点之间的距离加进去,如果距离唯一,说明点之间所有的距离相同, 然后用_builtin_popcount()计算二进制中多少个1 ,即表示加入了多少个点,求最大. Top

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

Topcoder SRM 刷题企划

1.本文用来记录自己在Topcoder上刷过的题目.不过重点是记录心得,记录自己的思路问题. 2.刷的题目全部都是Div2 1000分的题目,小概率会去做Div1 的进阶题. 3.基本上自己写出来的题目都不会另开一篇来写. 4.Topcoder使用: [教程1][教程2] SRM 508 Div2 YetAnotherORProblem (Div2 Hard) 题意:构造长度为N,各元素上限为R的序列,并且满足$A_1+A_2+\cdots+A_n=A_1|A_2|\cdots|A_n$,求方案

TopCoder SRM624 BuildingHeightEasy 题解

本题题意就是求有一组建筑物,问把这些建筑物的M个都统一到同一高度,需要的最小修改高度是多少? 题意隐含的意思就是因为是建筑物,所以不能减少,只能增加了. 本题可以使用暴力搜索,因为数据量少. 但是其实可以小排序,然后再求高度差的. 排序之后从第M个建筑物开始搜索,第M个建筑物与前面M个建筑物组成的建筑物群肯定是当前最小修改高度了. 一个题目要求的类和一个测试程序: #include <vector> #include <algorithm> #include <limits.

2-3 sshd服务---暴力破解应对策略

  sshd服务暴力破解步骤 sshd暴力破解方法 防止暴力破解调优 1. 变更默认端口 2. 变更root用户 3. 日志监控-->防止暴力破解(fail2ban应用) fail2ban详解 在初始化的服务器中,20种ssh服务调优方法! 技术来源于生活!!! =============================================== sshd服务暴力破解步骤 第一步:确认目标IP地址 第二步:确认目标端口--->根据目标开放端口,确定其操作系统 第三步:运行暴力破解程序

【TopCoder】SRM151 DIV2 练习总结

第一次做完整的SRM题,刷完感觉萌萌哒,不过自己对java中很多细节不熟练,还要边做题边google. 250分的题:判断字符串序列是否是前缀码,如果不是,返回第一个违反前缀码规则的字符串. 简单的暴力方法,要积累的是java中startsWith的用法: 1 public boolean startsWith(String prefix) 如果prefix是调用该函数的字符串的前缀,返回true,否则返回false.从实际经验来看,对大小写是敏感的,即No不是not的前缀. 完整代码连接:Gi

TopCoder SRM 刷水

怎么样快速提高姿势水平呢?自信说应该做TopCoder! 于是我就看到了很多XJOI题,BZOJ题……好像可以搬些题呢! 简单整理一下,方便未来搬题(雾 462C:先考虑从某个点出发,其出边有不能走的边,到终点距离在最坏情况下的最小值.再考虑从某个点出发,还不知道不能走的边在哪时,到终点距离在最坏情况下的最小值.前者枚举每条出边跑最短路,后者反着跑最短路,然后和前者的答案取较大值. 463C:BZOJ2454,一个点最多只有三种转移,某些情况下只有两种,如果以这些点为根来看,整个转移的结构就是一

Topcoder口胡记 SRM 562 Div 1 ~ SRM 592 Div 1

传送门:https://284914869.github.io/AEoj/index.html Topcoder SRM 562 Div 1 - Problem 1000 InducedSubgraphs 当K*2<=N的时候,显而易见的是编号为i(K<=i<=N-K+1)的点一定会形成一条链. 枚举合法的这样的链,剩下的暴力dp吧. 当K*2>N的时候,显而易见的是编号为i(N-K+1<=i<=K)的点一定会形成一个联通快. 如果把这个联通块去掉,树会形成若干个不相交

Topcoder Srm 673 Div2 1000 BearPermutations2

\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对于一个长度为 \(n\) 的排列,定义其的贡献为对其建笛卡尔树,树上有两个儿子的节点其左右儿子在原排列中的距离之和,给出 \(n, Mod\),求所有长度为 \(n\) 的排列的贡献之和对 \(Mod\) 取模的值 \(1 \leq n \leq 100\) 解题思路 : 考虑一个最暴力的 \(dp\) ,设