说实话,这次考试只有第三题恶心一点,太菜的我只有100,第二题写了正解没过
T1
1.爬山(mountain.cpp)
题目描述
FGD 小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够让
他对他的旅程有一个安排,他想知道山峰和山谷的数量。给定一个地图,为 FGD
想要旅行的区域,地图被分为 n*n 的网格,每个格子(i,j) 的高度 w(i,j)是给定的。
若两个格子有公共顶点(八连通),那么他们就是相邻的格子。我们定义一个格子
的集合 S 为山峰(山谷)当且仅当:
1. S 的所有格子都有相同的高度。
2. S 的所有格子都联通
3. 对亍 s 属亍 S,不 s 相邻的 s’丌属亍 S。都有 ws > ws’(山峰),戒者
ws < ws’(山谷)。
你的任务是,对亍给定的地图,求出山峰和山谷的数量,如果所有格子都有相同
的高度,那么整个地图即是山峰,又是山谷。
输入格式
第一行包含一个正整数 n,表示地图的大小(1<=n<=1000)。接下来一个 n*n
的矩阵,表示地图上每个格子的高度。 (0<=w<=1000000000)
输出格式
应包含两个数,分别表示山峰和山谷的数量。
输入输出样例
in:
5
8 8 8 7 7
7 7 8 8 7
7 7 7 7 7
7 8 8 7 8
7 8 8 8 8
out:
2 1
好吧,一道小水题(捂脸),也就想了半个小时(害羞)
直接贴代码,一道简单的搜索:
#include<bits/stdc++.h> using namespace std; #define ll long long #define cg ch=getchar() const int _=1002; ll number,mapp[_][_],ans1,ans2,pd1,pd2,res[_][_]; ll q[_*_][4],hd,tl,dx[9]={-1,-1,-1,0,0,1,1,1},dy[9]={-1,0,1,-1,1,-1,0,1}; ll read(){ ll s=0,w=1;char cg; while(ch<'0'||ch>'9')w=(ch=='-')?-1:1,cg; while(ch>='0'&&ch<='9')s=s*10+ch-'0',cg; return s*w; } void bfs(int x,int y){ hd=0;tl=1;res[x][y]=1;q[1][0]=x;q[1][1]=y; while(hd<tl){ hd++; ll nox=q[hd][0],noy=q[hd][1]; for(int i=0;i<8;i++){ ll nx=nox+dx[i],ny=noy+dy[i]; if(nx<1||nx>number||ny<1||ny>number)continue; if(mapp[nx][ny]==mapp[nox][noy]&&!res[nx][ny]){ res[nx][ny]=1;tl++;q[tl][0]=nx;q[tl][1]=ny; } else { if(mapp[nx][ny]>mapp[nox][noy]&&!pd1)pd1=1,ans1--; if(mapp[nx][ny]<mapp[nox][noy]&&!pd2)pd2=1,ans2--; } } } } int main(){ freopen("mountain.in","r",stdin); freopen("mountain.out","w",stdout); number=read(); for(int i=1;i<=number;i++) for(int j=1;j<=number;j++) mapp[i][j]=read(); for(int i=1;i<=number;i++) for(int j=1;j<=number;j++){ if(res[i][j])continue; ans1++;ans2++;pd1=0;pd2=0; bfs(i,j); } cout<<ans1<<" "<<ans2; return 0; }
T2:
题目描述
小 A 为了计算一天能干多少事,他将一天划分为 n 个单位时间,并告诉你这天
他可以干的 m 项工作,其中第 i 项工作需要从第 Si 时刻开始连续做 Ei 个时刻才
能完成,同时完成这项工作能获得 Pi 的收入。小 A 在某一时刻只能干一项工作,
并且一旦选择某项工作,必须丌间断一次性做完,问他一天的工作中能获得最多
的收入为多少,请你帮帮他进行工作的选取。
输入格式
第一行,一个整数 n(n<=5000)
第二行,一个整数 m(m<=5000)
接下来 m 行,描述 m 件事情,每行包含 3 个整数 Si、 Ei、 Pi。
输出格式
仅包含一行,为小 A 在这一天内所能获得最大收入。
输入输出样例
输入 #1
8 1
1 8 3
输出 #1
3
这道题按照某巨佬来说就是:“有手就行”
一个dp就好了,可惜我没有做出来,我好菜啊---感叹
接下来是代码:
#include<cstdio> #include<algorithm> using namespace std; #define maxn 5005 inline int read(){ int r=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+(c^48),c=getchar(); return r*f; } inline int max(int a,int b){ return a>b?a:b; } struct W{ int s,t,p; W() {} W(int s,int t,int p):s(s),t(t),p(p) {}; bool operator <(const W &work) const{ return s>work.s; } }w[maxn]; int s_n,n,m,s_m,f[2][maxn]; int main(){ freopen("job.in","r",stdin); freopen("job.out","w",stdout); n=read(),s_m=read(); for(int i=1;i<=s_m;i++){ int s=read(),t=s+read()-1,p=read(); if(s<1||t>n)continue; w[++m]=W(s,t,p); n=max(n,t); } sort(w+1,w+1+m); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ if(j<=w[i].s)f[i%2][j]=max(w[i].p+f[(i%2)^1][w[i].t+1],f[(i%2)^1][j]); else f[i%2][j]=f[(i%2)^1][j]; } printf("%d",f[m%2][1]); return 0; }
这个看起来好像不是我的风格,那就对了,我复制别人的,我的代码不见了
T3: