首页 > 其他分享 >洛谷P9752

洛谷P9752

时间:2023-10-21 23:46:44浏览次数:39  
标签:10 洛谷 暴力 int times vis Maxn P9752

考场上暴力100

题目传送门

思路

考虑到 \(n\) 很小,于是暴力,但不是枚举每个5位数再判断,而是把所有状态的可能正解用桶存个数,然后数量为 \(n\) 的就是一种方案

代码

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 10;
long long n, a[Maxn][Maxn], cnt, vis[Maxn * Maxn * Maxn * Maxn * Maxn * Maxn + 5];//vis 是桶

int ts(int a, int b, int c, int d, int e) {
  return a * 10000 + b * 1000 + c * 100 + d * 10 + e;
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  //	feropen("lock.in","r",stdin);
  //	feropen("lock.out","w",stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i][1] >> a[i][2] >> a[i][3] >> a[i][4] >> a[i][5];
    vis[ts(a[i][1], a[i][2], a[i][3], a[i][4], a[i][5])] = -114514;//所有状态均不为正确密码
  }
  //只动一位
  for (int mmt = 1; mmt <= n; mmt++) {
    for (int i = 1; i <= 9; i++) {
      vis[ts((a[mmt][1] + i) % 10, a[mmt][2], a[mmt][3], a[mmt][4], a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], a[mmt][4], (a[mmt][5] + i) % 10)]++;
    }
  }
  for (int mmt = 1; mmt <= n; mmt++) {
    for (int i = 1; i <= 9; i++) {
      (vis[ts((a[mmt][1] + i) % 10, a[mmt][2], a[mmt][3], a[mmt][4], a[mmt][5])] == n) && (cnt++, vis[ts((a[mmt][1] + i) % 10, a[mmt][2], a[mmt][3], a[mmt][4], a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])] == n) && (cnt++, vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])] == n) && (cnt++, vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, a[mmt][5])] == n) && (cnt++, vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], a[mmt][4], (a[mmt][5] + i) % 10)] == n) && (cnt++, vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], a[mmt][4], (a[mmt][5] + i) % 10)] = 0);
    }
  }
	// 同时动两位
  for (int mmt = 1; mmt <= n; mmt++) {
    for (int i = 1; i <= 9; i++) {
      vis[ts((a[mmt][1] + i) % 10, (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, (a[mmt][4] + i) % 10, a[mmt][5])]++;
    }
    for (int i = 1; i <= 9; i++) {
      vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, (a[mmt][5] + i) % 10)]++;
    }
  }
  for (int mmt = 1; mmt <= n; mmt++) {
    for (int i = 1; i <= 9; i++) {
      (vis[ts((a[mmt][1] + i) % 10, (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])] == n) && (cnt++, vis[ts((a[mmt][1] + i) % 10, (a[mmt][2] + i) % 10, a[mmt][3], a[mmt][4], a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])] == n) && (cnt++, vis[ts(a[mmt][1], (a[mmt][2] + i) % 10, (a[mmt][3] + i) % 10, a[mmt][4], a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, (a[mmt][4] + i) % 10, a[mmt][5])] == n) && (cnt++, vis[ts(a[mmt][1], a[mmt][2], (a[mmt][3] + i) % 10, (a[mmt][4] + i) % 10, a[mmt][5])] = 0);
    }
    for (int i = 1; i <= 9; i++) {
      (vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, (a[mmt][5] + i) % 10)] == n) && (cnt++, vis[ts(a[mmt][1], a[mmt][2], a[mmt][3], (a[mmt][4] + i) % 10, (a[mmt][5] + i) % 10)] = 0);
    }
  }
  cout << cnt;
  return 0;
}

时间复杂度

暴力者切记,超时无敌(听双节棍听的)

\(\ \ \ \ O(2 \times 5 \times n \times 10 + 2 \times 4 \times 8 \times 10 + 8 \times 5)\)

\(=O(2 \times 5 \times 8 \times 10 + 2 \times 4 \times 8 \times 10+ 8 \times 5)\)

\(=O(1480)\)

标签:10,洛谷,暴力,int,times,vis,Maxn,P9752
From: https://www.cnblogs.com/mouseboy/p/17779767.html

相关文章

  • P9752 [CSP-S 2023] 密码锁 题解
    分析最水S组T1。每次可以转动一个拨圈,或者转动相邻的两个拨圈,且幅度相同。那么就有一个简单粗暴的思路,枚举修改的方案,用vector来储存修改后的方案,存到map当中,当然也可以转换为数字存进去。切记要用两个map来储存,一个存方案,下文称为\(mp\),一个存这个方案在这个状态下......
  • 【洛谷 8665】[蓝桥杯 2018 省 A] 航班时间
    #[蓝桥杯2018省A]航班时间##题目描述小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京......
  • 【洛谷 8772】[蓝桥杯 2022 省 A] 求和
    #[蓝桥杯2022省A]求和##题目描述给定$n$个整数$a_{1},a_{2},\cdots,a_{n}$,求它们两两相乘再相加的和,即$$S=a_{1}\cdota_{2}+a_{1}\cdota_{3}+\cdots+a_{1}\cdota_{n}+a_{2}\cdota_{3}+\cdots+a_{n-2}\cdota_{n-1}+a_{n-2}\cdota_{n}+a_{n-1}\cdota......
  • 【洛谷 8647】[蓝桥杯 2017 省 AB] 分巧克力
    #[蓝桥杯2017省AB]分巧克力##题目描述儿童节那天有$K$位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有$N$块巧克力,其中第$i$块是$H_i\timesW_i$的方格组成的长方形。为了公平起见,小明需要从这$N$块巧克力中切出$K$块巧克力分给小......
  • 【洛谷 8597】 [蓝桥杯 2013 省 B] 翻硬币
    #[蓝桥杯2013省B]翻硬币##题目背景小明正在玩一个“翻硬币”的游戏。##题目描述桌上放着排成一排的若干硬币。我们用`*`表示正面,用`o`表示反面(是小写字母,不是零),比如可能情形是`**oo***oooo`,如果同时翻转左边的两个硬币,则变为`oooo***oooo`。现在小明的问题是:如果......
  • 洛谷 P4749 [CERC2017] Kitchen Knobs 题解
    KitchenKnobs首先,一个trivial的想法是,因为每个旋钮如果上面的数字并非全部相同则其必有唯一最优位置,故直接扔掉那些全部相同的旋钮,对于剩余的求出其最优位置。明显此位置是一\(0\sim6\)的数。因为是区间同时旋转,所以转成数之后就是区间加同一个数。一个经典套路是差分。这......
  • 洛谷B2005 字符三角形(python)
    这题重点在如果输入print(a,a,a,a,a),逗号会使输出的时候五个字符之间有空格,应该用a+a+a+a+a。代码如下a=input();print(""+a)print(""+a+a+a)print(a+a+a+a+a) ......
  • 洛谷4363总结
    什么叫做博弈论DP呢?这里也是双方采取最佳策略,但是与普通博弈论不同的是,这里问的不是先手必胜or必败,而是问的最优值因此称作博弈论DP那么这种DP也是像SG游戏一样,我们想出博弈图然后倒推同时这题也是轮廓线DP,具体见这篇题解那么为什么菲菲要max,牛牛要min呢?我们就考虑dp数组的......
  • 洛谷 P8192 - [USACO22FEB] Paint by Rectangles P
    比较抽象的一个题。首先先考虑\(T=1\),如果我们建一张图,将图上所有横线与竖线的交点看作图上的点,相邻的有线段相连的点看作图上的边的话,那么显然会得到一张平面图,而我们要计算的是平面图上面的个数,根据公式\(F=E-V+C+1\),其中\(C\)为这张图中连通块的个数。设\(c\)为线段与线......
  • 洛谷P9290 [ROI 2018] Decryption 题解
    include<bits/stdc++.h>pragmaGCCoptimize(1)pragmaGCCoptimize(2)pragmaGCCoptimize(3,"Ofast","inline")defineregregisterdefineintlonglongusingnamespacestd;inlineintread(){shortf=1;intx=0;charc=getchar();......