計蒜客/小教官(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 问题:对于每个询问的起点终点,求 ...
随机推荐
- Hybrid--WebView中使用Ajax
Hybrid框架下的app,使用的Ajax.须要注意的是UIWebViewDelegate不会监測到Ajax的request.也就是再运行Ajax代码时.shouldStartLoadWithReuq ...
- Java多线程学习(吐血超详细总结)转自博主林炳文Evankaka
文章由林炳文Evankaka原创.转载自http://blog.csdn.net/evankaka 写在前面的话:此文只能说是Java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果 ...
- Maximum Memory and CPU Limitations for Linux Server
grep NR_CPUS /boot/config-`uname -r` [webdev@test apache-flume-1.8.0-bin]$ grep NR_CPUS /boot/config ...
- java之选择排序
//选择排序(Select Sorting)也是一种简单的排序方法.它的基本思想是:第一次从R[0]-R[n-1]中选取最小值,与R[0]交换,第二次从R[1]-R[n-1]中选取最小值,与R[1] ...
- meteor---在合并打包多个文件ZIP下载的功能
实现多个文件边打包边下载的功能,速度还可以,本人亲测,欢迎大家来指点archiver --用NPM安装这个模块---本人文件存储在file-collection 中,可以用fs : fs.create ...
- Decorator Pattern
1.Decorator 模式通过组合的方式提供了一种给类增加职责(操作)的方法. 2.Decorator模式结构图 3.实现 #ifndef _DECORATOR_H_ #define _DECORA ...
- appium(11)-java-client
Welcome to the Appium Java client wiki! This framework is an extension of the Selenium Java client. ...
- wifi方式调试android程序
1. 通过wifi, 利用adb来连接手机. 在pc的cmd中输入命令: adb connect 192.168.1.100 其中adb就是手机的ip. 如果连接成功, 就可以进入android的sh ...
- 小程序observer函数的应用
需求是这样的 就是构建月份的组件中,月份小于10月的时候 显示的数字都是一个位数,需要转换成两位数, 比如8月份是8 ,那就要转换为08 ,同理可得 其他低于十月份的月份也是要这样做: 打开组件的js ...
- BZOJ 1617 [Usaco2008 Mar]River Crossing渡河问题:dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1617 题意: Farmer John以及他的N(1 <= N <= 2,500 ...