Codeforces Round #661 Div3 앞의 4가지 문제(풍덩
50370 단어 CF 보충 문제 요약
카탈로그
A - Remove Smallest
아이디어:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define pi acos(-1)
#define N 5010
using namespace std;
int a[N];
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
bool flag = 0;
for(int i = 1; i < n; i++)
{
if(a[i] - a[i - 1] > 1)
{
flag = 1;
break;
}
}
if(flag)
printf("NO
");
else
printf("YES
");
}
return 0;
}
B - Gifts Fixing
아이디어:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define pi acos(-1)
#define N 5010
using namespace std;
typedef long long ll;
ll a[N], b[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
int amin = INF, bmin = INF;
for(int i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
if(a[i] < amin)
amin = a[i];
}
for(int i = 0; i < n; i++)
{
a[i] -= amin;
}
for(int i = 0; i < n; i++)
{
scanf("%lld", &b[i]);
if(b[i] < bmin)
bmin = b[i];
}
for(int i = 0; i < n; i++)
{
b[i] -= bmin;
}
ll ans = 0;
for(int i = 0; i < n; i++)
{
if(a[i] < b[i])
ans += b[i];
else
ans += a[i];
}
printf("%lld
", ans);
}
}
C - Boats Competition
처음에는 C문제 WA가 멍청해져서 아무리 해도 문제를 찾지 못하고 완전히 폭력적인 과오를 다시 썼다.마지막으로 앞부분을 검사했을 때 첫 번째 문장의 초기화 범위가 for(int i = 0; i <= n; i++) num[i] = 0
폭력용memset
이었기 때문이라는 것을 발견했다.문제를 다시 한 번 보고 n을 2*n으로 고쳐 넘겼다.만약 경기장에서 C문제 WA 8발이었다면, 결과는 상상조차 할 수 없었을 것이다...
아이디어:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define pi acos(-1)
#define N 1100
using namespace std;
typedef long long ll;
int a[N];
int num[N];
bool vis[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
int minn = INF;
int maxx = -1;
int cnt = 0;
scanf("%d", &n);
for(int i = 0; i <= 2 * n; i++)
num[i] = 0;
for(int i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
if(minn > x)
minn = x;
if(maxx < x)
maxx = x;
if(num[x] == 0)
a[cnt++] = x;
num[x]++;
}
int ans = 0;
for(int sum = minn * 2; sum <= maxx * 2; sum++)
{
int tmp = 0;
for(int i = 0; i < cnt; i++)
{
if(sum - a[i] == a[i])
{
tmp += num[a[i]];
continue;
}
tmp += num[sum - a[i]] < num[a[i]] ? num[sum - a[i]] : num[a[i]];
}
ans = tmp / 2 > ans ? tmp / 2 : ans;
}
printf("%d
", ans);
}
return 0;
}
코드(최적화되지 않은 버전):
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define pi acos(-1)
#define N 1100
using namespace std;
typedef long long ll;
int a[N];
int num[N];
bool vis[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i <= 2 * n; i++)
num[i] = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
num[a[i]]++;
}
ll ans = -1;
for(int sum = 2; sum <= 2 * n; sum++)
{
ll tmp = 0;
for(int i = 1; i <= sum; i++)
tmp += min(num[i], num[sum - i]);
ans = max(tmp / 2, ans);
}
printf("%lld
", ans);
}
return 0;
}
D - Binary String To Subsequences
아직 경기장에 안 썼어...아이디어:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define pi acos(-1)
#define N 1000100
using namespace std;
typedef long long ll;
char str[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
scanf("%s", str);
ll cnt = 0;
queue <ll> q0, q1;
vector <ll> ans;
for(int i = 0; i < n; i++)
{
if(str[i] == '0')
{
if(q1.empty())
ans.push_back(cnt++);
else
{
ans.push_back(ans[q1.front()]);
q1.pop();
}
q0.push(i);
}
else
{
if(q0.empty())
ans.push_back(cnt++);
else
{
ans.push_back(ans[q0.front()]);
q0.pop();
}
q1.push(i);
}
}
printf("%lld
", cnt);
for(auto i : ans)
{
printf("%lld ", i + 1);
}
printf("
");
}
return 0;
}
경기 후 소결: