2018年东北农业大学春季校赛----不完整题解

题目出的还是可以,题面读的懂,题意比较清楚,练一下板子题比较舒服

就是自己太菜了QAQorz

/**B**/

给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

现在让你连接相邻两条边的中点,然后只保留他们围成封闭图形区域的数字,那么这个矩阵变为

3

7

8

9

11

12

13

14

15

17

18

19

23

现在你们涵哥让你求变化后的矩阵的所有元素的和为多少

矩阵求和,直接推公式,一个小技巧就是直接用一个数字代表值,而不用开二维数组来存这个矩阵

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int main() {
    int N;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        int m=N/2;
        long long sum=0;
        int k=1;
        int t=1;
            for(int i=0;i<N;i++){
                for(int j=0;j<N;j++){
                int x=i;
                int y=j;
                int p1=-1*i+m;
                int p2=i-m;
                int p3=i+m;
                int p4=-1*i+3*m;
                if(y>=p1&&y>=p2&&y<=p3&&y<=p4){
                    sum+=t;
                }
                    t++;
            }
      }
        printf("%lld
",sum);
    }
    return 0;
}
View Code

/***D***/

给你一个n*m的迷宫,这个迷宫中有以下几个标识:

s代表起点

t代表终点

x代表障碍物

.代表空地

现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。

直接bfs搜一遍就行,裸题

#include<bits/stdc++.h>
using namespace std;
#define MAX_N 1005
#define MAX_M 1005
const int INF=1000000;
int N,M;
int sx,sy;
int gx,gy;
int d[MAX_N][MAX_M];
typedef pair<int,int> P;
char maze[MAX_N][MAX_M];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs()
{
    queue<P>que;
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++) d[i][j]=INF;
    que.push(P(sx,sy));
    d[sx][sy]=0;
    while(que.size()){
        P p=que.front();que.pop();
        if(p.first==gx&&p.second==gy) break;
        for(int i=0;i<4;i++){
            int nx=p.first+dx[i],ny=p.second+dy[i];
            if(0<=nx&&nx<N&&0<=ny&&ny<=M&&maze[nx][ny]!='x'&&d[nx][ny]==INF){
               que.push(P(nx,ny));
               d[nx][ny]=d[p.first][p.second]+1;
               }
        }
 
    }
    return d[gx][gy];
}
 
void solve()
{
    int res=bfs();
    if(res!=INF){
        printf("YES
");
    }else{
        printf("NO
");
    }
}
int main()
{
        int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&N,&M);
        int i,j;
        for(i=0;i<N;i++){
           scanf("%s",maze[i]);
        }
        for(i=0;i<N;i++){
            for(j=0;j<M;j++){
                if(maze[i][j]=='s'){sx=i;sy=j;}
                if(maze[i][j]=='t'){gx=i;gy=j;}
            }
        }
 
        solve();
    }
    return 0;
}
View Code

/***I***/

wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的k个物品的总价值和总重量的比值)

最大化最小值

挑战143面原题

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, t, k, w[100010], v[100010];
double y[100010];
int C(double x)
{
    for(int i = 0; i < n; i++){
        y[i] = v[i]-x*w[i];
    }
    sort(y, y+n);
    double sum = 0;
    for(int i = 0; i < k; i++){
        sum += y[n-i-1];
    }
    return sum >= 0;//转成与0比较
}
int main()
{
    cin >> t;
    while(t--){
        cin >> n >> k;
        for(int i = 0; i < n; i++){
            cin >> w[i] >> v[i];
        }
        double lb = 0, ub = 1000;
        for(int i = 0; i < 100; i++){
            double mid = (lb+ub)/2;
            if(C(mid)){
                lb = mid;
            }
            else{
                ub = mid;
            }
//            printf("%g %g %g
",lb,ub,mid);
            //cout << mid << endl;
        }
        printf("%.2lf
", lb);
    }
    return 0;
}
View Code

/**L**/

你们wyh学长小时候住在河边,因为周围的生态环境非常好,所以经常会有天鹅浮在湖面上,每只天鹅都长得不一样,它们偶尔排成一排,偶尔分散开,偶尔也会去其他河畔,wyh学长为了统计它们的个数,编了一个程序赋予它们一个“萌”值,但是这些天鹅很不听话,一会儿会从别的地方游过来一两只,一会儿又会在统计过程中游走一两只,现在请你帮他完成统计任务。

线段树板子题0.0

#include <bits/stdc++.h>
using namespace std;
  
const int maxn = 1e6+10;
int T;
  
int s[maxn * 4];
  
char op[20];
int n, m;
int ans;
  
void build(int l, int r, int rt) {
  s[rt] = 0;
  if(l == r) return;
  int mid = (l+r)/2;
  build(l, mid, 2*rt);
  build(mid+1, r, 2*rt+1);
}
  
void update(int pos, int val, int l, int r, int rt) {
  if(l == r) {
    s[rt] += val;
    return;
  }
  int mid = (l+r)/2;
  if(pos <= mid) update(pos, val, l, mid, 2 * rt);
  else update(pos, val, mid+1, r, 2*rt+1);
  s[rt] = s[2*rt]+s[2*rt+1];
}
  
void query(int k, int l, int r, int rt) {
  if(l == r) {
    ans = l;
    return;
  }
  int mid = (l+r)/2;
  if(s[2*rt+1] >= k) query(k,mid+1,r,2*rt+1);
  else query(k - s[2*rt+1],l,mid,2*rt);
}
  
int main() {
  scanf("%d",&T);
  while(T--) {
    scanf("%d%d",&n,&m);
    build(0,1e6,1);
    for(int i = 1; i <= n; i ++) {
      int x;
      scanf("%d",&x);
      update(x,1,0,1e6,1);
    }
      
    while(m--) {
      scanf("%s", op);
      int x;
      scanf("%d", &x);
      if(op[0] == 'q') {
        query(x,0,1e6,1);
        printf("%d
", ans);
      } else if(op[0] == 'i') {
        update(x, 1, 0, 1e6, 1);
      } else {
        update(x, -1, 0, 1e6, 1);
      }
    }
      
  }
  return 0;
}
View Code
每一个不曾刷题的日子 都是对生命的辜负 从弱小到强大,需要一段时间的沉淀,就是现在了 ~buerdepepeqi
原文地址:https://www.cnblogs.com/buerdepepeqi/p/8728072.html