题意:
Q 老师有 N 个学生,每个学生都有各自独立的编号,且编号范围在 1 ~ N 之间。
这一天,所有学生都在不同的时间进入教室。
Q 老师记录了当编号为 i 的学生进入教室时,教室中共有 Ai 个学生(包括编号为 i 的学生)。
现要求根据这些记录,给出学生进入教室的顺序。
Constrains:
1 ≤ N ≤ 1e5
1 ≤ Ai ≤ N,Ai 各不相同
所有数字均为整数
Input:
N
A1 A2 … AN
Output:
根据学生进入教室的顺序输出学生的编号.
Sample Input&Output
**思路:**使用了一个结构person来表示人的序号以及进来的时候教室里有多少人。并且声明了一个p[1000005]的数组来储存进来的同学。将p重新排序,根据此同学进来的时候教室里有的同学个数升序排序,然后在遍历数组输出同学的序号即可。
代码:
#include
#include
#include
using namespace std;
int n;
struct person
{
int i;
int Ai;
}p[100005];
bool cmp(person&p1,person&p2)
{
return p1.Ai<p2.Ai;
}
int main()
{
cin>>n;
for(int j=1;j<=n;j++)
{
p[j].i=j;
cin>>p[j].Ai;
}
sort(p+1,p+1+n,cmp);
for(int j=1;j<=n;j++)
{
cout<<p[j].i<<" ";
}
}
题意:
众所周知,ZJM 住在 B 站。
这一天 Q 老师来找 ZJM 玩,ZJM 决定向 Q 老师展现一下自己快速看番的本领。
ZJM 让 Q 老师任意挑选了一部番,Q老师一眼看中了《辉夜大小姐想让我告白》,已知这部番一共有 N 个精彩片段,每个精彩片段用 [L[i], R[i]] 来表示。
ZJM 从第一分钟开始看,每次可以按下快进键,快进 X 分钟,问 ZJM 最快需要多久可以看完这部番。
Input:
第一行给出两个整数 N、X(1 ≤ N ≤ 50, 1 ≤ X ≤ 1e5)
接下来 N 行,每行给出两个整数,L[i]、R[i](1 ≤ L[i] ≤ R[i] ≤ 1e5)
数据保证,R[i-1] < L[i]
Ouput:
输出一个整数,表示 ZJM 最快看完这部番的时间。
Examples:
Input
2 3
5 6
10 12
Output
6
Input
1 1
1 100000
Output
100000
Note:
在第一个样例中,ZJM 从第 1 分钟开始看,由于 [1, 3] 区间内没有精彩片段,因此 ZJM 快进到了第 4 分钟。
观看完 [4, 6] 区间的内容后,时间来到了第 7 分钟,由于 [7, 9] 区间内没有精彩片段,因此 ZJM 快进到了第 10 分钟,观看完 [10, 12] 区间的内容后,看番结束。
一共耗时 3 + 3 = 6 分钟。
思路: 和之前那个猫猫又要睡觉又要看番的那个题稍微有点类似。
代码:
#include
#include
#include
using namespace std;
int n,x;
struct Time
{
int l;
int r;
}tm[55];
int main()
{
cin>>n>>x;
for(int i=1;i<=n;i++)
{
cin>>tm[i].l>>tm[i].r;
}
int j=1,now=1;
int ans=0;
while(now<=tm[n].r)
{
if(now+x<=tm[j].l)
{
now=now+x;
//cout<
}
else
{
//cout<
ans=ans+tm[j].r-now+1;
now=tm[j].r+1;
j++;
//cout<
}
}
cout<<ans<<endl;
}
题意:
TT 的神秘任务系列。
这一次,TT 得到了一个长度为 N 的字符串,任务要求在原字符串中至多删去一个字符,使得字符串的字典序尽可能小。
字符串字典序的比较优先级如下:
1.从左往右第一个不同字符的 ASCII 值的大小关系
2.字符串长度
Input:
第一行给出 N(2 ≤ N ≤ 2e5)。
第二行给出一个长度为 N,且仅包含小写字母的字符串.
Output:
输出字典序最小的字符串。
Examples:
Input
3
aaa
Output
aa
Input
5
abcda
Output
abca
思路: 删掉第一个字符比比它后面的字符大的这个元素,或者如果全部都一样则删掉字符串最后一个。
总结: 这道题其实栽坑里去了,我把删掉第一比后面大的元素变为删掉字符串中最大的那个字符。为什么删掉最大的字符不对呢?因为最大的那个字符不一定是第一个比后面的大字符所以不对。
这道模拟题其实挺简单的,但是理解错题意了。失策失策。
代码:
#include
#include
#include
using namespace std;
const int maxp=2*1e5+5;
int n;
char s[maxp];
int main()
{
cin>>n;
int maxc=0,rand=0;
char c;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
for(int i=1;i<=n;i++)
{
if(s[i]>s[i+1])
{
rand=i;
maxc=s[i]-'a';
break;
}
else
continue;
}
if(maxc==0)//如果从头到尾都一样
{
for(int i=1;i<=n-1;i++)
cout<<s[i];
cout<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
if(i==rand)
continue;
else
cout<<s[i];
}
cout<<endl;
}
}
题意:
瑞瑞最近迷上了字符串,因此决定出一个字符串的题。
给定两个正整数 N、K,考虑所有由 N - 2 个 a 和 2 个 b 组成的字符串,要求输出其中字典序第 K 小的。
例如当 N = 5 时,共有如下 10 种组成方式:
aaabb
aabab
aabba
abaab
ababa
abbaa
baaab
baaba
babaa
bbaaa
Input:
多组数据,第一行给定 T,表示数据组数。(1 ≤ T ≤ 1e4)
对于每组数据,给出两个正整数 N、K。(3 ≤ N ≤ 1e5, 1 ≤ K ≤ min(2e9, N * (N-1) / 2 ))
N 的总和不会超过 1e5.
Output:
对于每组数据,输出长度为 N 的字典序第 K 小的字符串。
Examples:
Input
7
5 1
5 2
5 8
5 10
3 1
3 2
20 100
Output
aaabb
aabab
baaba
bbaaa
abb
bab
aaaaabaaaaabaaaaaaaa
**总结:**记得要初始化字符串,我的天,我在这里栽了好多次了
代码:
#include
#include
#include
using namespace std;
int t,n;
long long int k;
char c[100010];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
memset(c,'\0',sizeof(c));
for(int i=1;i<=n;i++)
c[i]='a';
long long int s1=1+8*k;
long long int w=ceil((double)(sqrt(s1)-1)/2);
long long int s=w*(w+1)/2-k;
long long int index1=s;
c[n-w+1+s]='b';
c[n-w]='b';
for(int i=1;i<=n;i++)
cout<<c[i];
cout<<endl;
}
}
题意:
苟狗定义了一种新式字符串,只有掌握了这种字符串的构造方法,才可以避免宇宙射线的打击。
新式字符串定义如下:
长度为偶数(可以为空)
每一个奇数位置的字符都不等于它后面的那个字符
例如,字符串 good、string、xyyx 都符合要求,而字符串 bad、aa、aabc 则不符合。
现在你获得了一个字符串 S,你需要从该字符串中删除最少的字符数,使其变成一个新式字符串,否则你就会受到宇宙射线的打击,众所周知宇宙射线是降智射线。
那么你能够避开宇宙射线吗?
Input:
一个行给定一个整数 N(1 <= N <= 200000),表示字符串 S 的长度。
第二行给定长度为 N 且仅包含小写字母的字符串 S.
Output:
第一行输出一个数 K(0 <= K <= N),表示需要从 S 中删除的最少的字符数量。
第二行输出删除后的字符串 S。如果为空,你可以输出一个空字符串或者什么都不输出。
Examples:
Input
4
good
Output
0
good
Input
4
aabc
Output
2
ab
Input
3
aaa
Output
3
总结:是一道蛮简单的模拟题,但是我居然在test4超时了,我想了一下估计是因为我是删掉一个元素以后把之后的元素又挪了一遍,当数据量大的时候会超时
所以我有采用了两个数组,一个是答案数组。思路类似
代码:
#include
using namespace std;
int n,k=0;
char s[200010];
char ans[200010];
int main()
{
cin>>n>>s;
int index1=0;
int index2=0;
while(index1<n-1)
{
if((index2+1)%2==1)
{
if(s[index1]!=s[index1+1])
ans[index2]=s[index1],index1++,index2++;
else
k++,index1++;
}
else
ans[index2]=s[index1],index1++,index2++;
}
if(index2%2==0)
ans[index2]='\0',k++;
else
ans[index2]=s[n-1],ans[index2+1]='\0';
cout<<k<<endl;
cout<<ans<<endl;
}