CF写炸两题的蒟蒻在线求助帮查错
  • 板块灌水区
  • 楼主__gcd
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/8 00:39
  • 上次更新2023/11/6 20:58:48
查看原帖
CF写炸两题的蒟蒻在线求助帮查错
149192
__gcd楼主2020/8/8 00:39

两道题全部喜提 WA on pretest 2。

B(排序锅了):

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline int read()
{
	int x = 0; bool op = 0;
	char c = getchar();
	while(!isdigit(c))op |= (c == '-'), c = getchar();
	while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return op ? -x : x;
}

const int N = 100010;
int n, q;
int num[N];
struct Node
{
	int id;
	bool operator < (const Node &tmp) const
	{
		return num[id] < num[tmp.id];
	}
	Node(int id = 0):id(id){} 
};
priority_queue<Node> pq;

void query()
{
	int a = pq.top().id; pq.pop();
	int b = pq.top().id; pq.pop();
	int c = pq.top().id; pq.pop();
	if(num[a] >= 8)printf("YES\n");
	else if(num[a] >= 6 && num[b] >= 2)printf("YES\n");
	else if(num[a] >= 4 && num[b] >= 4)printf("YES\n"); 
	else if(num[a] >= 4 && num[b] >= 2 && num[c] >= 2)printf("YES\n");
	else printf("NO\n");
	pq.push(Node(a)); pq.push(Node(b)); pq.push(Node(c));
	return ;
}

int main()
{
	n = read();
	for(int i = 1; i <= n; i++)
	{
		int len = read();
		num[len]++; 
	}
	for(int i = 1; i <= 100000; i++)
		pq.push(Node(i));
	q = read();
	for(int i = 1; i <= q; i++)
	{
		char c; cin >> c;
		int x = read();
		if(c == '-')num[x]--;
		else num[x]++;
		query();
	}
	return 0;
}

C(不知道为什么,也许是做法就是错的):

思路:贪心地选择出现次数最多的放在前面,边放边记录最小相同馅饼的距离。

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline int read()
{
	int x = 0; bool op = 0;
	char c = getchar();
	while(!isdigit(c))op |= (c == '-'), c = getchar();
	while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return op ? -x : x;
}

const int N = 100010;
int n;
int num[N], last[N];

bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	int t = read();
	while(t--)
	{
		memset(num, 0, sizeof(num));
		memset(last, 0, sizeof(last));
		int n = read();
		for(int i = 1; i <= n; i++)
		{
			int a = read();
			num[a]++;
		}
		sort(num + 1, num + 1 + n, cmp);
		int ans = 1e9, i = 1;
		while(i <= n)
		{
			int p = 1;
			while(num[p] != 0)
			{
				if(last[p] != 0)
					ans = min(ans, i - last[p] - 1);
				last[p] = i; num[p]--;
				i++; p++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
2020/8/8 00:39
加载中...