1 序列查询
100分
#include<iostream>
using namespace std;
int main()
{
int n, N;
cin >> n >> N;
int A[205] = { 0 };
int i, j;
int cur = 1, num = 0;
for (i = 1; i <= n; i++)
cin >> A[i];
A[n + 1] = N;
for (i = 0; i < N; i++)
{
if (i < A[cur])
{
num += (cur - 1);
}
else if (i == A[cur])
{
num += cur;
cur++;
}
}
cout << num << endl;
return 0;
}
2 序列查询新解
70分
#include<iostream>
using namespace std;
int main()
{
int n, N;
cin >> n >> N;
int A[100005] = { 0 };
int i, j;
int cur = 1;
long long num = 0;
for (i = 1; i <= n; i++)
cin >> A[i];
A[n + 1] = N;
int r = N / (n + 1);
int now;
for (i = 0; i < N; i++)
{
if (i < A[cur])
{
now = abs(cur - 1 - i / r);
num += now;
}
else if (i == A[cur])
{
now = abs(cur - i / r);
num += now;
cur++;
}
}
cout << num << endl;
return 0;
}
100分
#include<iostream>
using namespace std;
int main()
{
int n, N;
cin >> n >> N;
int A[100005] = { 0 };
int i, j;
int cur = 1;
long long num1 = 0, num2 = 0;
int r0 = N / (n + 1);
int now;
for (i = 1; i <= n; i++)
cin >> A[i];
A[n + 1] = N;
int l, r, temp;
l = 0, r = A[1] - 1;
for (i = 1; i <= n + 1; i++)
{
num2 = 0;
for (j = l; j <= r;)
{
temp = (j / r0 + 1) * r0 - 1;
if (temp >= r)
{
num2 += (abs(i - 1 - j / r0) * (r - j + 1));
break;
}
else
{
num2 += (abs(i - 1 - j / r0) * (temp - j + 1));
j = temp + 1;
}
}
num1 += num2;
l = A[i];
r = A[i+1] - 1;
}
cout << num1 << endl;
return 0;
}
3. 登机牌条码
80分
#include<iostream>
#include<map>
#include<queue>
#include<vector>
#include<math.h>
using namespace std;
typedef long long ll;
ll w, s, k;
string ss;
vector<long long> ans;
int mode = 1; //1:大写,0:小写,-1:数字
long long gx[3000] = { 0 }, dx[3000] = { 0 }, qx[3000] = { 0 }, rx[3000] = { 0 }, qgx[3000] = { 0 };
void tonumber()
{
int i;
for (i = 0; i < ss.length(); i++)
{
if (ss[i] >= 'A' && ss[i] <= 'Z')
{
if (mode == 1)
{
ans.push_back(ss[i] - 'A');
}
else if (mode == 0)
{
ans.push_back(28);
ans.push_back(28);
mode = 1;
ans.push_back(ss[i] - 'A');
}
else if (mode == -1)
{
ans.push_back(28);
mode = 1;
ans.push_back(ss[i] - 'A');
}
}
else if (ss[i] >= 'a' && ss[i] <= 'z')
{
if (mode == 1)
{
ans.push_back(27);
mode = 0;
ans.push_back(ss[i] - 'a');
}
else if (mode == 0)
{
ans.push_back(ss[i] - 'a');
}
else if (mode == -1)
{
ans.push_back(27);
mode = 0;
ans.push_back(ss[i] - 'a');
}
}
else if (ss[i] >= '0' && ss[i] <= '9')
{
if (mode == 1)
{
ans.push_back(28);
mode = -1;
ans.push_back(ss[i] - '0');
}
else if (mode == 0)
{
ans.push_back(28);
mode = -1;
ans.push_back(ss[i] - '0');
}
else if (mode == -1)
{
ans.push_back(ss[i] - '0');
}
}
}
}
void tomazi()
{
if (ans.size() % 2 == 1)
{
ans.push_back(29);
}
vector<long long> temp;
for (int i = 0; i < ans.size(); i += 2)
{
temp.push_back(30 * ans[i] + ans[i + 1]);
}
ans = temp;
}
void tocalseq()
{
int num, nn;
num = ans.size() + 1;
if ((num + k) % w == 0)nn = 0;
else nn = w - (num + k) % w;
num += nn;
vector<long long> temp;
temp.push_back(num);
for (auto i : ans)
{
temp.push_back(i);
}
for (int i = 0; i < nn; i++)
{
temp.push_back(900);
}
ans = temp;
}
int main()
{
int i, j;
cin >> w >> s;
cin >> ss;
if (s == -1)
{
k = 0;
}
else
{
k = int(pow(2, s + 1));
}
tonumber();
tomazi();
tocalseq();
if (s == -1)
{
for (auto i : ans)
{
cout << i << endl;
}
return 0;
}
gx[1] = 1;
gx[0] = -3;
ll temp1, temp2, xishu = -3;
for (i = 2; i <= k; i++)
{
xishu *= 3;
xishu %= 929;
temp1 = gx[0];
gx[0] *= xishu;
for (j = 1; j <= i; j++)
{
temp2 = ((gx[j] * xishu) % 929 + temp1) % 929;
temp1 = gx[j];
gx[j] = temp2 ;
}
}
temp1 = ans.size();
for (auto i : ans)
{
dx[temp1 - 1 + k] = i % 929;
temp1--;
}
int point = ans.size() - 1 + k;
i = ans.size() - 1;
qx[i] = dx[point] / gx[k];
i--;
point--;
for (; i >= 0; i--)
{
temp1 = 0;
for (j = 0; j <= point; j++)
{
if (qx[j] != 0 && gx[point - j] != 0)
{
temp1 += ((qx[j] * gx[point - j]) % 929);
temp1 %= 929;
}
}
qx[i] = (dx[point] - temp1) % 929;
point--;
}
for (i = ans.size() - 1 + k; i >= 0; i--)
{
temp1 = 0;
for (j = 0; j <= i; j++)
{
if (qx[j] != 0 && gx[i - j] != 0)
{
temp1 += ((qx[j] * gx[i - j]) % 929);
temp1 %= 929;
}
}
qgx[i] = temp1 % 929;
}
for (i = k - 1; i >= 0; i--)
{
if (qgx[i] < 0)
{
ans.push_back(929 + qgx[i] % 929);
}
else
{
ans.push_back(qgx[i] % 929);
}
}
for (auto i : ans)
{
cout << i << endl;
}
return 0;
}