笔试总时间2h,15单选 + 5不定选 花了40分钟!!!剩余80分钟做3道编程题,对于基础不好的我太难了!
选择题不用说了,每道题目都是正儿八经的专业题,基础好点的就没啥问题,然鹅我的基础不好!平衡二叉树忘记了!!!
编程题:
第一题:AC 赤裸裸的差分,线段树也可以,但是差分比较简单,
思路:比较简单吧,直接贴代码吧!
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int a[maxn];
int b[maxn];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("a.txt", "r", stdin);
#endif
int t;
cin >> t;
while(t--) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
int len, n;
cin >> len >> n;
for(int i = 1; i <= n; ++i) {
int l, r;
cin >> l >> r;
b[l]++;
b[r+1]--;
}
for(int i = 1; i <= len; ++i) a[i] = a[i-1] + b[i];
for(int i = 1; i <= len; ++i) {
if(i < len) cout << a[i] << " ";
else cout << a[i] << endl;
}
}
return 0;
}
第二题:AC 每个人选一个满足自己角色值以上的,求最大总数量的人被提名为候选前提下的每个人的选择情况,不能选择就为-1
思路:看到数据量n <= 1000, n^2可以直接贪心,每个人按照val递增排序,每个觉得也按val递增排序,然后从最小的那个val开始寻找,找到第一个满足就跳出。下一个继续!
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mp make_pair
#define ios ios::sync_with_stdio(false),cin.tie(0);
const int maxn = 1010;
pii a[maxn];
pii b[maxn];
int ans[maxn];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("b.txt", "r", stdin);
#endif
auto de = [](const pii& l, const pii& r){return l.second > r.second;};
auto en = [](const pii& l, const pii& r){return l.second < r.second;};
int t;
cin >> t;
while(t--) {
int n, m, val;
cin >> n >> m;
for(int i = 1; i <= n; ++i) {cin >> val; a[i] = {i, val};}
for(int i = 1; i <= m; ++i) {cin >> val; b[i] = {i, val};}
sort(a + 1, a + n + 1, en);
sort(b + 1, b + m + 1, en);
memset(ans, -1, sizeof(ans));
for(int i = 1; i <= n; ++i) {
int idx = -1;
for(int j = 1; j <= m; ++j) {
if(b[j].second == -1 || b[j].second < a[i].second) continue;
idx = j;
b[j].second = -1;
break;
}
if(idx == -1) break;
ans[a[i].first] = b[idx].first;
}
for(int i = 1; i <= n; ++i) {
if(i < n) cout << ans[i] << " ";
else cout << ans[i] << endl;
}
}
return 0;
}
第三题:
思路:
我的思路是:每一步都几下怎么走到下一步的。用一个状态记录f[i][j], 表示走j步到i的数量,枚举1 - m的步数状态,
然后要注意不能和前两步一样,因为记录了状态,直接排除相等的j就行,时间太短了,最后没有写完就到时间了!
对于动态规划的转移方程还不是很娴熟。继续学习吧!希望路过的大佬回复下你们的思路。学习!
代码:(后续参照别人的思路写出来的)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ios ios::sync_with_stdio(false),cin.tie(0);
const int maxn = 100005;
const int MOD = 1e9 + 7;
int f[maxn][8][8];
ll dfs(int n, int m, int pre1, int pre2) {
if(n <= 0) {
return (n == 0) ? 1 : 0;
}
if(f[n][pre1][pre2]) return f[n][pre1][pre2];
ll cnt = 0;
for(int i = 1; i <= m; ++i) {
if(i == pre1 || i == pre2) continue;
cnt += dfs(n-i, m, i, pre1);
}
f[n][pre1][pre2] = cnt % MOD;
return f[n][pre1][pre2];
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("c.txt", "r", stdin);
#endif
int n, m;
while(cin >> n >> m) {
memset(f, 0, sizeof(f));
cout << dfs(n, m, 0, 0) << endl;
}
return 0;
}
全部评论
(0) 回帖