Atcoder Beginner Contest 271
A.484558
十进制转换为十六进制
方法一
模拟
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int N = 110, INF = 0x3f3f3f3f;
int main()
{
int n;
cin >> n;
stack<int> num;
while (n)
{
num.push(n % 16);
n /= 16;
}
int cnt = 0;
if (num.size() == 0)
cout << "00" << endl;
else if (num.size() == 1)
cout << "0";
while (num.size())
{
int t = num.top();
num.pop();
cnt++;
if (t <= 9)
cout << t;
else
cout << (char)(t - 10 + 'A');
}
return 0;
}
方法二
printf("%02X",n);
即可
B.Maintain Multiple Sequences
给定一个n行,每行都不一定相等的矩阵 a a a,求出 a [ i ] [ j ] a[i][j] a[i][j]
方法一
前缀和+数组模拟
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
vector<int> s[N];
int n, m;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
int sz = 0;
cin >> sz;
for (int j = 0; j < sz; j++)
{
int t;
cin >> t;
s[i].push_back(t);
}
}
while (m--)
{
int a, b;
cin >> a >> b;
cout << s[a - 1][b - 1] << endl;
}
return 0;
}
方法二
v e c t o r vector vector动态数组
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
vector<int> s[N];
int n, m;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
int sz = 0;
cin >> sz;
for (int j = 0; j < sz; j++)
{
int t;
cin >> t;
s[i].push_back(t);
}
}
while (m--)
{
int a, b;
cin >> a >> b;
cout << s[a - 1][b - 1] << endl;
}
return 0;
}
C.Manga
给定一个数组,每次可以随意删除两个未用过的元素,来换取想要的任意一个元素,最终能凑成 1 , 2 , 3... n 1,2,3 ... n 1,2,3...n这个数列的最大长度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <unordered_map>
#include <set>
using namespace std;
const int N = 300010;
bool a[N];
int n, m;
int main()
{
int n, tmp, dup = 0;
cin >> n;
vector<int> a;
set<int> s;
for (int i = 0; i < n; i++)
{
cin >> tmp;
if (!s.find(tmp))
{
a.push_back(tmp);
s.insert(tmp);
}
else
{
dup++;
}
}
sort(a.begin(), a.end());
int start = 0;
int last = a.size() - 1;
int cnt = 0;
int cur = 1;
while (true)
{
if (last >= start && a[start] == cur)
{
start++;
cnt++;
}
else if (dup >= 2)
{
cnt++;
dup -= 2;
}
else if (dup == 1)
{
if (last - start >= 1)
{
last--;
dup--;
cnt++;
}
else if (last - start == 0)
{
last--;
start++;
dup--;
cnt++;
}
else
{
break;
}
}
else if (last - start >= 1)
{
last -= 2;
cnt++;
}
else
{
break;
}
cur++;
}
cout << cnt << endl;
return 0;
}