2020智算之道高校 复赛

A
在这里插入图片描述

签到题。

#pragma warning (disable:4996)
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <queue>
#include <stack>
#include <set>
#include <list>
#include <map>
#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);
 }
}

B
在这里插入图片描述
在这里插入图片描述

DP,对于矩阵的每一个魔法格点来说,dp数组记录它到右上角(n, n)位置能经过的最多的魔法格点的个数。
状态转移方程:dp[j] = max{ dp[i] } +1;(i 在 j 右上方)
这里给节点排序时我用的是节点到(n, n)点的距离。

#pragma warning (disable:4996)
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <queue>
#include <stack>
#include <set>
#include <list>
#include <map>
#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
这道直接略过了 本渣渣不会。。。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值