两道题全部喜提 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;
}