题目出的还是可以,题面读的懂,题意比较清楚,练一下板子题比较舒服
就是自己太菜了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; }
/***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; }
/***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; }
/**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; }