Week15实验-T1T2训练

A - Q 老师的记录册


Q 老师有 N 个学生,每个学生都有各自独立的编号,且编号范围在 1 ~ N 之间。这一天,所有学生都在不同的时间进入教室。Q 老师记录了当编号为 i 的学生进入教室时,教室中共有 Ai 个学生(包括编号为 i 的学生)。现要求根据这些记录,给出学生进入教室的顺序。

Constraints

1 ≤ N ≤ 1e5;1 ≤ Ai ≤ N,Ai 各不相同;所有数字均为整数

Input

输入格式如下:

N
A1 A2 … AN

Output

根据学生进入教室的顺序输出学生的编号。

思路:
  • 在输入value时,直接对数组tmp[value]赋值编号即可,这样便根据人数直接确定了顺序,最后输出数组值即可。
实现:
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
int N;
int tmp[maxn]; 
int main()
{
	ios::sync_with_stdio(false);
	cin>>N;
	int x;
	for(int i=1;i<=N;++i)
	{
		cin>>x;
		tmp[x]=i;//i表示编号 
	}
	for(int i=1;i<=N;++i)cout<<tmp[i]<<" "; 
	return 0;
}

B - ZJM 的本领

https://vjudge.net/problem/CodeForces-499A/origin

众所周知,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]

Output

输出一个整数,表示 ZJM 最快看完这部番的时间。

思路:
  • 对于非精彩部分,直接去掉X的整倍数,直到最接近精彩部分,然后观看;因此需要记录上次观看的起始部分。
实现:
#include
#include
#include
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	int s=1,l,r;
	int N,X,res=0;
	cin>>N>>X;
	
	int tmp,st = 1;
	while(N--)
	{
		cin>>l>>r;
		tmp=(l-st)/X;//可以理解成l-1-st+1,因为l/st属于闭区间:[st,l) [l,r]
		st+=tmp*X;
		tmp=(r-st)+1;
		res+=tmp;
		st = r+1;
	}
	cout<<res;
	return 0;
}

C - TT 的神秘任务 - X

https://vjudge.net/problem/CodeForces-1076A/origin

这一次,TT 得到了一个长度为 N 的字符串,任务要求在原字符串中至多删去一个字符,使得字符串的字典序尽可能小。字符串字典序的比较优先级如下:从左往右第一个不同字符的 ASCII 值的大小关系;字符串长度

Input

第一行给出 N(2 ≤ N ≤ 2e5)。第二行给出一个长度为 N,且仅包含小写字母的字符串。

Output

输出字典序最小的字符串。

思路:
  • 挑出第一个满足s[i]>s[i+1]的字母,删除s[i];如果这样的字母不存在那么直接删除最后一个字母即可。(越靠前在字典序中“权重”越大)
实现:
#include
#include
#include
#include
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	int n;
	string s;
	cin>>n>>s;
	int index=-1;
	for(int i=0;i<s.size()-1;++i)
	if(s[i] > s[i+1])
	{
		index=i;
		break;
	}
	
	if(index == -1)s.erase(s.size()-1,1);
	else s.erase(index,1);
	cout<<s;
	return 0;
}

F - 东东:“来不及解释了,快上车!!”

https://vjudge.net/problem/CodeForces-1153A/origin

东东要上学了!东东要去他家路口的公交车站等车!!!东东从家出发,需要 d 分钟到达公交站台。

已知有 n 班公交车,第 i 路公交车在 a_i 分钟到达公交站台,随后每 b_i 分钟会有该路公交车。东东想着他要迟到了!!!可恶!!!要迟到了!!于是他看见了一辆公交车来了,立马跳上了这辆"他见到的"第一辆公交车。东东上车后发现了一个问题!!这不是去幼儿园的车!!!!可惜车门已经焊死。那么问题来了东东上的是第几路车?

Input

第一行输入路线数n和东东到达的时间d(1≤n≤100,1≤d≤1e5)

接下来n行,每行两个数字a_i和b_i(1≤a_i,b_i≤1e5),分别为该路公交首辆车到达的时间和两辆车之间的发车间隔。如果有多种可能,输出一种

Output

东东所上车的公交车的路线编号。

思路:
  • 先求出每一路公交车最先到达站台的时间,即>=d的时间,之后挑出其中最小的时间对应的公交车即可。
实现:
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
int n,d,index;
int a[maxn],b[maxn];

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>d;
	index=1;
	int g = n;
	while(n--)
	{
		cin>>a[index]>>b[index];
		index++;
	}
	int ans=1e9,res=1e9;
	for(int i=1;i<=g;++i)
	{
		while(true)
		{
			if(a[i]>=d)break;
			else a[i]+=b[i];
		}
		if(a[i]<ans)
		{
			ans = a[i];
			res = i;
		}
	}
	cout<<res;
	return 0;
}

你可能感兴趣的:(程序设计思维与实践)