Codeforces Round #831 (Div. 1 + Div. 2)A-D

117 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
本文已参与「新人创作礼」活动,一 起开启掘金创作之路

A.Factorise N+M

根据哥德巴赫猜想一个偶数肯定可以分成两个质数之和所以本体我们只需要判断输入的数据是奇数的话+3(因为1不为质数)偶数加2即可

 void solve()
 {
 int n; cin >> n;
  if(n & 1) cout << 3 << endl;
  else cout << 2 << endl;
  }

B. Jumbo Extra Cheese 2

我们可以根据奶酪的长宽来进行排序因为他要求的是周长所以当我们以从小到大的顺序进行排列时我们只需要记录最大的长或者宽即可

const int N = 2e5 + 10;
PII a[N];
void solve()
{
   int n; cin >> n;
   rep(i,n) cin >> a[i].fi >> a[i].se;
   rep(i,n) if(a[i].fi < a[i].se) swap(a[i].fi,a[i].se);
   sort(a + 1,a + 1 + n);
   int res = 1e18;
   int num = 0;
   rep(i,n) num += a[i].se;
   res = min(res,num * 2 + a[n].fi * 2);
   rep(i,n)  swap(a[i].fi,a[i].se);
    sort(a + 1,a + 1 + n);
    num = 0;
    rep(i,n) num += a[i].se;
   res = min(res,num * 2 + a[n].fi * 2);
   cout  << res << endl;
}

C . Bricks and Bags

题目给我们三个袋子然后我们所花费的代价时w1w2+w2w3|w_1 - w_2|+|w_2-w_3|根据这个公式我们可以想到我们可以让一个 绝对值的值时最大的然后让另一个绝对值的值尽量最小即可
所以我们先对数组进行排序,距离这个数字差值最远的肯定时数组两端的值差值最小的肯定是与他相邻的数字所以我们直接进行枚举即可

typedef pair<int,int> PII;
const int N = 2e5 + 10;
int a[N];
void solve()
{
    int n; cin >> n;
    rep(i,n) cin >> a[i];
    sort(a + 1,a + 1 + n);
    int res = 0;
    for(int i = 3; i <= n; i++) {
        res = max(res,a[i] * 2 - a[1] - a[i - 1]);
    }
    for(int i = n - 2; i >= 1; i--) {
       res = max(res,a[n] + a[i + 1] - 2 * a[i]);
    }
   cout << res << endl;
}

D - Knowledge Cards

个人感觉C题的难度远大于D题,我们可以发现如果棋盘上有一个空格的话这个棋盘上所有的卡牌都可以进行重新组合所有我们只需要去判断在棋盘全部放满之前能否有数字可以放到(n,m)(n,m)就行

int a[N];
void solve()
{
   int n,m,k; cin >> n >> m >> k;
   rep(i,k) cin >> a[i];
   bool f = true;
   int  p = k + 1;
   int cnt = 0;
   priority_queue<int> q;
   rep(i,k) {
      cnt ++;
      q.push(a[i]);
      while( q.size() &&q.top() == p - 1) {
         cnt--;
         q.pop();
         p --;
      }
      if(cnt >= n * m - 2 - 1) {
         cout << "TIDAK" << endl;
         return ;
      }
   }
   cout << "YA" << endl;
}