codeforces 141C Queue

题意:

有n个人,对于第i个人给出h[i]表示在她之前有多少个人比她高,现在让你构造出每个人的身高和顺序使得这些h数组都成立。

题解:

很显然我们应该先让h[i]小的人站在前面,这样从小开始就可以保证正确性。

令第一个人的身高为1并且h[1]必定为0,那么对于第i个人,在1~i中有h[i]个人身高比她高,那么就有i - h[i] - 1个人身高比她低,那么她的身高理论上应该为i-h[i],但是这就会影响比她高的那些人的身高,解决方法就是就在1 ~ i中大于等于她的理论身高的人的身高就+1~

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 3e3 + 7;
struct node {
	char name[N];
	int h;
}p[N];

bool cmp (node a, node b) {return a.h < b.h;}

int main () {
	int n;
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf ("%s%d", p[i].name, &p[i].h);

	sort (p + 1, p + 1 + n, cmp);
	for (int i = 1; i <= n; ++i) {
		if (p[i].h > i - 1) {
			puts ("-1");
			return 0;
		}
		p[i].h = i - p[i].h;
		for (int j = 1; j < i; ++j) {
			if (p[j].h >= p[i].h) ++p[j].h;
		}
	}
	for (int i = 1; i <= n; ++i) printf ("%s %d\n", p[i].name, p[i].h);
	return 0;
}

  

总结:

QAQ智商题啊!!!大牛~蒟蒻做不到啊~感觉并没有什么套路可循,完全智商碾压吧~

但是这种题一般考虑第一个位置,最后一个位置,最大的数,最小的数。

时间: 2024-10-11 18:25:22

codeforces 141C Queue的相关文章

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

Codeforces 38G Queue 伸展树

题目链接:点击打开链接 题意: 给定n个人来排队 每个人有2个参数,身份优先级和脸皮厚度 == 来的那个人会排到队尾 如果这个人的优先级比他前面那个人的优先级大就会和前面那个人交换位置. 交换一次脸皮厚度减1, 一直交换到队头或者脸皮厚度为0 交换完成后下一个人才会到来. 问: 队伍最后的情况(从队头到队尾依次输出每个人的编号) 思路:splay 维护子树的最小值. 插入时递归插入,若当前点是空就插这个位置. 然后就是裸的splay.. == #include <stdio.h> #inclu

Codeforces 490B Queue【模拟】

题意还是很好理解的,根据题目给出描述条件然后求出这串QUEUE 我的做法就是用两个数组 before[] 和 after[] 表示 ai 前面的前面的人的学号 和 ai 后面的后面的人的学号 ex[] 表示 ai 这个人在输入的时候出现的次数,这个数组用于当人数为奇数的时候,寻找第1个人学号,只要遍历一遍1 - 10^6即可 具体还是看代码吧 QAQ ,感觉代码还是比较好理解的. [这道题目 RE 起码5次,真正原因是数组没有开到位 = = ,也真是觉得自己最近没有写代码了好弱.........

codeforces 490B.Queue 解题报告

题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位置的人他前面是无人的!于是 a1 = 0.最后那个人的后面是木有人的,即 bn = 0.然后根据这些条件求出整个序列是如何排的,输出答案. 这条题卡了好久.........啊........啊........啊 首先很容易知道第二个位置的人的编号 和 倒数第二个人的位置编号.用一个aft[]数组记录

CodeForces 91B Queue (线段树单点操作)

Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue. The i-th walrus has the age

CodeForces 545D Queue (排序模拟)

[题目链接]:click here~~ [题目大意]: 有n个人,每个人都有一个等待时间,如果对于当前的人来说总等待时间超过自己的等待时间,那么这个人就会失望,问换一下顺序,使失望的人最少,问最多有多少个人不失望. [思路]:排一下序然后加然后与当前的比较.如此.. 代码: /* * Problem: CodeForces 545D * Running time: 46MS * Complier: G++ * Author: herongwei * Create Time: 8:20 2015/

Codeforces 545D - Queue

545D - Queue 思路:忍耐时间短的排在前面,从小到大排序,贪心模拟,记录当前等待时间,如过等待时间大于当前的这个人得忍耐时间,那么就把这个人扔到最后面,不要管他了(哼╭(╯^╰)╮,谁叫你那么没耐心呢),所以也就不用记录为他服务的时间. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),si

CodeForces 490B Queue

题意: 一个队列  每个人记录了自己前面和后面的人  求队列顺序 思路: 明显站在奇数位置上的人记录了前后两个偶数位置的人  站在偶数位置上的人同样 所以对于偶数位置  只要从0往后找就可以了 对于奇数位置  只要先找到第一个人  然后往后找就可以了 代码: #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #inc

codeforces 38G - Queue splay伸展树

题目 https://codeforces.com/problemset/problem/38/G 题意: 一些人按顺序进入队列,每个人有两个属性,地位$A$和能力$C$ 每个人进入时都在队尾,并最多可以和前一位互换$C$次,如果前一位的地位高于自己,则无法继续互换. 最终一次性输出整个队列 题解: splay维护动态的队列 可以用类似权值线段树的思维去考虑 对于每个点,保存其子节点的最大值,自身的值,与子树的大小 对于每次插入时,若能跨过整颗右子树与当前节点,则向左走,否则向右 可以保证整个子