Codeforces Round 654 Div.2 题解

感觉自己每次打CF都在划水。。。

A

很显然答案就是n2\lceil \frac{n}{2} \rceil

B

分情况讨论,当 n>rn > r 时显然答案就是r×(r+1)2\frac{r\times (r+1)}{2},然后再观察一下数据。。。
另一种的答案就是n×(n1)2+1\frac{n\times (n-1)}{2}+1。。。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef double dd;
const int N = 1e5+5;
const dd eps = 1e-8;
const int mod = 1e9+7;

int t;
ll n,r;

int main(){
  // freopen("input.txt","r",stdin);
  scanf("%d",&t);
  while(t--){
    scanf("%lld %lld",&n,&r);
    if(n <= r){
      printf("%lld\n",(n*(n-1)/2)+1);
    }
    else{
      printf("%lld\n",r*(r+1)/2);
    }
  }
  return 0;
}

C

题意:

给定了a个第一类糖果和b个第二类糖果,分别有n个第一种人和m个第二种人。

取糖果的规则时:

假设两种糖果当前数目为v和c:

  1. 当 v > c时,第一种人选第一种糖果,第二种人选第二种糖果
  2. 反之,第一种人选第二种糖果,第二种人选第一种糖果。

我们可以发现一个性质:第二种人总是选择当前最少的糖果,所以显然第二种人能得到的糖果最多有min(a,b)种,所以我们只需要判断 bmin(a,b)b \le \min(a,b)以及n+ma+bn + m \le a+b 即可

D

构造题,最后猜一下规律。。。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef double dd;
const int N = 1e5+5;
const dd eps = 1e-8;
const int mod = 1e9+7;
 
int table[320][320],t,n,k;
 
int main(){
  // freopen("input.txt","r",stdin);
  scanf("%d",&t);
  while(t--){
    scanf("%d%d",&n,&k);
    memset(table,0,sizeof(table));
    printf("%d\n",k%n == 0 ? 0 : 2);
    int p = 0,q = 0;
    while(k--){
      table[p+1][q+1] = 1;
      p++;q = (q+1)%n;
      if(p == n){
				p = 0;q = (q+1)%n;
      }
    }
    for(int i = 1;i <= n;i++){
      for(int j = 1;j <= n;j++) printf("%d",table[i][j]);
      printf("\n");
    }
  }
  return 0;
}