計蒜客/小教官(xjb)
題目鏈接:https://nanti.jisuanke.com/t/366
題意:中文題誒~
思路: 先通過給出的條件構造一個符合題意的數組(可以是任意一個符合條件的數組,菜雞不會證明;
然後構造的數組和初始序列1, 2, 3, 4...n最少不同元素的個數就是答案;
這點是比較好理解的:題目中給出的b1, b2, ...bm可以是不連續的, 那麼如果每次選擇的m個與初始序列不同位置的元素並且通過一次操作後可以到達初始序列所在位置;
那麼所需代價肯定是最小的,總代價即爲位置不同的元素的數目. 所有情況都可以分解爲m爲 2 或 3的情況的組合,而對於m爲2, 3的情況前面所述顯然是正確的;
那麼剩下的問題就是求目標序列和構造序列最少多少個元素不同了,注意這裏的序列是循環序列;
對於循環序列, 並不確定其開頭元素是那個,枚舉其開頭元素的話,時間復雜度爲O(n^2), 顯然會tle;事實上也並不需要那樣做,可以先求最多有多少個元素與初始序列位置相同;
再用n減一下即可. 注意這裏的初始序列是一個特殊的序列,爲1, 2, 3, 4...n, 那麼可以用(a[i]-i+n)%n表示其相對序列,相對序列號相同的元素一定存在某個開頭元素使其位置與
初始序列是相同的, 所以只要找出最多的相對序列號相同的元素數目即爲對多與初始序列位置相同的元素的個數;
注意還要逆時針再計算一邊相對序列號相同的最多元素數目;
代碼:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; const int MAXN=5e4+;
int a[MAXN], vis[MAXN];
struct node{
int f, s;
}gg[MAXN]; int main(void){
int n;
scanf("%d", &n);
for(int i=; i<=n; i++){
scanf("%d%d", &gg[i].f, &gg[i].s);
}
a[]=;
vis[]=true;
int indx=, cnt=;
while(){//構造序列
int cc=gg[cnt].f;
if(vis[cc]){
cc=gg[cnt].s;
if(vis[cc]) break;
}
vis[cc]=true;
a[++indx]=cc;
cnt=cc;
}
if(indx<n){
cout << - << endl;
return ;
}
indx=;
while(indx<n){//變成下標從0開始,便宜後面計算
a[indx]=a[indx+];
indx++;
}
memset(vis, , sizeof(vis));
int cc=;
for(int i=; i<n; i++){//順時針計算相對序號
int temp=(n+a[i]-i)%n;
vis[temp]++;
}
for(int i=; i<n; i++){
cc=max(cc, vis[i]);
}
memset(vis, , sizeof(vis));
for(int i=; i<n; i++){//逆時針計算相對序號
int temp=(n+a[n--i]-i)%n;
vis[temp]++;
}
for(int i=; i<n; i++){
cc=max(cc, vis[i]);
}
printf("%d\n", n-cc);
return ;
}
計蒜客/小教官(xjb)的更多相关文章
- 計蒜客/數正方形(dp)
題目鏈接:https://nanti.jisuanke.com/t/44 題意:中文題誒~ 思路: 用dp[i][j]存儲以(i, j)爲左上定點的最大正方形變長,從右下角網左上角一次計算所有頂點: ...
- 计蒜客的一道题dfs
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客:Entertainment Box
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...
- 计蒜客 31436 - 提高水平 - [状压DP]
题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...
- 计蒜客 31434 - 广场车神 - [DP+前缀和]
题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...
- 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)
ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...
- 运用NP求解 “跳跃游戏”---计蒜客
计蒜客里面有一道“跳跃游戏的问题” 给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 你的目标是到达最后一个下标,并且使用最少的跳跃次数. ...
- [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】
Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...
随机推荐
- checkAll全选的一个小例子
function checkAll(tag,flag) { //得到所有check var checkboxs = $(tag).closest("table").find(&qu ...
- AndroidPageObjectTest_ByAllPossible.java
以下代码使用ApiDemos-debug.apk进行测试 //这个脚本用于演示PageFactory的功能:使用注解@AndroidFindAll定位元素.注解用法参考页面类代码. package c ...
- platform_set_drvdata()/platform_get_drvdata()/container_of()【转】
本文转载自:http://blog.csdn.net/angle_birds/article/details/8443695 platform_set_drvdata(struct platform_ ...
- LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数
题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function PDF (English) Statistics Forum ...
- git 合并子分支
1.子分支 $ git status 位于分支 base 无文件要提交,干净的工作区 2.子分支更新 $ git pull origin base 来自 http://106.14.59.204/ji ...
- nginx + ffmpeg
第一种方案:ffmpeg+nginx 新的ffmpeg已经支持HLS.(本人也参与了代码供献,给自己做个广告:)) 点播: 生成hls分片: ffmpeg -i <媒体文件> -c:v l ...
- LA-3942(trie树+dp)
题意: 给出一个由多个不同单词组成的字典,和一个长字符串,把这个字符串分解成若干个单词的连接,问有多少种方法; 思路: dp[i]表示s[i,L]的方案数,d[i]=∑d[j];s[i,j-1]是一个 ...
- centos服务器安装配置Postgre9.6
安装: STEP1:下载对应rpm yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64 ...
- 51nod1060:最复杂的数(DFS求反素数)
把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数. 例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等,输出最 ...
- multi_socket
threading_test.py #threading #为什么在命令行可以执行,F5不能执行 #线程处理能导致同步问题 from socketserver import TCPServer,Thr ...