签到题。
#pragma warning (disable:4996)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0X7f7f7f7f
#define MS_I(x) memset(x,-inf,sizeof(x))
#define MS(x) memset(x,0,sizeof(x))
#define MS_1(x) memset(x,-1,sizeof(x))
#define MSI(x) memset(x,inf,sizeof(x))
#define random(a,b) ((long long)rand()%(b-a+1)+a)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e6 + 20;
const int mod = 998244353;
ll a, aa, b;
int main()
{
scanf("%lld%lld", &aa, &b);
if (b == 1)
{
printf("900\n");
}
else if (b == 2)
{
if (aa % b)
printf("0\n");
else
printf("900\n");
}
else
{
ll len = 1;
ll tmp = aa;
while (tmp)
{
len *= 10;
tmp /= 10;
}
int ans = 900;
for (int i = 100; i <= 999; i++)
{
tmp = i * len + aa;
if (tmp % b)
ans--;
}
printf("%d\n", ans);
}
}
DP,对于矩阵的每一个魔法格点来说,dp数组记录它到右上角(n, n)位置能经过的最多的魔法格点的个数。
状态转移方程:dp[j] = max{ dp[i] } +1;(i 在 j 右上方)
这里给节点排序时我用的是节点到(n, n)点的距离。
#pragma warning (disable:4996)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0X7f7f7f7f
#define MS_I(x) memset(x,-inf,sizeof(x))
#define MS(x) memset(x,0,sizeof(x))
#define MS_1(x) memset(x,-1,sizeof(x))
#define MSI(x) memset(x,inf,sizeof(x))
#define random(a,b) ((long long)rand()%(b-a+1)+a)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 20;
const int mod = 998244353;
int n, k, w1, w2;
pair<int, int> m[2020];
double dist(pair<int, int> t)
{
return (n - t.first) * (n - t.first) + (n - t.second) * (n - t.second);
}
bool cmp(pair<int, int> a, pair<int, int> b)
{
double da = dist(a), db = dist(b);
return da < db;
}
int ans = 0;
int cnt = 0;
int dp[2020];
int main()
{
scanf("%d%d%d%d", &n, &k, &w1, &w2);
bool flag = 0;
for (int i = 1; i <= k; i++)
{
int x, y;
scanf("%d %d", &x, &y);
if (flag == 0 && x != y)
flag = 1;
if (x != n && y != n)
m[i] = make_pair(x, y);
}
if (n <= 3)
{
cnt = 2;
ans = w2 * cnt + 2 * w1 * (n - (ll)cnt);
printf("%d\n", ans);
}
else if (w1 * 2 <= w2)
{
ans = 2 * n * w1;
printf("%d\n", ans);
}
else if (!flag)
{
ans = w2 * k + 2 * w1 * (n - k);
printf("%d\n", ans);
}
else
{
sort(m + 1, m + k + 1, cmp);
cnt = -1;
for (int i = 1; i <= k; i++)
{
for (int j = 1; j <= i - 1; j++)
if (m[i].first < m[j].first && m[i].second < m[j].second)
{
dp[i] = max(dp[i], dp[j]);
}
dp[i] += 1;
cnt = max(cnt, dp[i]);
}
ans = w2 * cnt + 2 * w1 * (n - (ll)cnt);
printf("%d\n", ans);
}
}
C
比赛的时候只过了60分。。。
【待补题】
D
比赛的时候只过了20分。。。。。。。
【待补题】
E
这道直接略过了 本渣渣不会。。。。。。。。。。。