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

Posted buerdepepeqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",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\n");
    }else{
        printf("NO\n");
    }
}
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\n",lb,ub,mid);
            //cout << mid << endl;
        }
        printf("%.2lf\n", 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\n", ans);
      } else if(op[0] == i) {
        update(x, 1, 0, 1e6, 1);
      } else {
        update(x, -1, 0, 1e6, 1);
      }
    }
      
  }
  return 0;
}
View Code

 

以上是关于2018年东北农业大学春季校赛----不完整题解的主要内容,如果未能解决你的问题,请参考以下文章

二数 (埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛)

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B合约数

第一届佳木斯大学程序设计校赛题解

代写程序作业代写《大学计算机》课程报告作业

河南工业大学2017校赛题解

代写程序作业代写《大学计算机》课程报告作业