网易内推8.8笔试

1.给出一个数,最多能划分成多少素数AC
2.买票 。给出有几个人,几个人单独买票的时间,每个人和钱一个人一起买票的时间,商店08:00:00开门,输出最早的关门时间 未AC,动态方程没搞对
3.丢弃礼物。背包问题。(类似力扣“最高的广告牌”)
4.互相认可的教授有几对。(图,强连通分量)

1.牛牛现在有n个正整数的数组a,牛牛可以将其中的每个数a[i]都拆成若干个和为a[i]的正整数,牛牛想知道拆后(也可以一个都不拆)这个数组最多能有多少个素数。
输入描述
第一行一个正整数n表示数组的长度
第二行n个正整数表示a[i]的值
1 <= n <= 1e6,1 <= a[i] <= 1e9
输出描述
拆后数组最多的素数个数
示例1
输入
3
1 1 1
输出
0
说明
由于1不能再拆,并且1不是素数,所以拆后最多有0个素数
解法
要求的是拆完的素数最多,可以理解为将每个数拆成素数最多的方案,2是最小的素数,使劲拆出2即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, d; cin >> n;
int ans = 0;
for (int i = 0; i < n; ++i) {
cin >> d;
ans += d / 2;
}
cout << ans << endl;
return 0;
}
如输入5,输出2(2,3)输入1输出0
用了取巧的做法,分奇偶之后,偶数/2.(奇数-3)/2

2.作者:chaiser
链接:https://www.nowcoder.com/discuss/471054?type=post&order=time&pos=&page=0&channel=1014&source_id=search_post
来源:牛客网

int main() {
int T, n;
cin >> T;

for (int ii = 0; ii < T; ii++) {
    int dp[2001];
    memset(dp, -1, sizeof(dp));
    dp[0] = 0;
    cin >> n;
    vector<int> a(n), b(n - 1);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    dp[1] = a[0];
    for (int i = 0; i < n - 1; i++) {
        cin >> b[i];
    }

    for (int i = 2; i <= n; i++) {
        dp[i] = min(dp[i - 1] + a[i - 1], dp[i - 2] + b[i - 2]);
    }
    int hh, mm, ss;
    ss = dp[n] % 60;
    mm = (dp[n] / 60) % 60;
    hh = (dp[n] / 3600 + 8) % 24;
    bool am = true;
    if (hh >= 12) {
        am = false;
        hh -= 12;
    }

}

}

3.现在有n个物品,每个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人分到的物品价值总和相同(个数可以不同,总价值相同即可),剩下的物品就要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。

输入描述
第一行输入一个整数T,代表有T组测试数据

对于每一组测试数据,一行输入一个整数n,代表物品的个数

接下来n个数,a[i]代表每一个物品的价值

1 <= T <= 10

1 <= n <= 15

1 <= a[i] <= 100000

输出描述
每一行输出最少需要扔掉多少价值的物品
示例1
输入
1
5
30 60 5 15 30
输出
20
说明
样例解释,扔掉第三个和第四个物品,然后将第一个物品和第五个物品给第一个人,第二个物品给第二个人,每个人分到的价值为60,扔掉的价值为20。
解法
#include <bits/stdc++.h>
using namespace std;

const int siz=1500000;
int a[20],dp[siz+5];
int main(){
int T, n, i, j, ans, sum;
cin >> T;
while (T–) {
cin >> n;
sum = 0;
for (i = 0; i < n; ++i){
cin >> a[i];
sum += a[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (i = 0; i < n; ++i){
for (j = sum; j >= a[i]; --j)
dp[j] = dp[j] | dp[j-a[i]];
}
ans = sum;
for (i = sum; i >= 0; --i) {
if( i % 2 != 0) continue;
if(dp[i] && dp[i/2]) {
ans = sum - i;
break;
}
}
cout << ans << endl;
}
return 0;
}
4.https://zhuanlan.zhihu.com/p/177004229
https://blog.csdn.net/DebugMyself/article/details/107939822

#include <bits/stdc++.h>
using namespace std;

const int maxn = 555;
#define ll long long
int low[maxn], num[maxn], dfn, cnt;
ll ans;
int sccno[maxn];
stack st;
vector G[maxn];

void dfs(int u) {
st.push(u);
low[u] = num[u] = ++dfn;
for (int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if (!num[v]){
dfs(v);
low[u] = min(low[u], low[v]);
} else if (!sccno[v]) {
low[u] = min(low[u], num[v]);
}
}
if (low[u] == num[u]) {
cnt++;
int tmp = 0;
while(true) {
int v = st.top();
st.pop();
tmp++;
sccno[v] = cnt;
if (u == v) break;
}

    ans += tmp * (tmp - 1) / 2;
}

}

void tarjan(int n) {
cnt = dfn = 0;
ans = 0;
memset(sccno, 0, sizeof(sccno));
memset(low, 0, sizeof(low));
memset(num, 0, sizeof(num));
for (int i = 1; i <= n; ++i) {
if (!num[i]) dfs(i);
}
}

int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
G[a].push_back(b);
}
tarjan(n);
cout << ans << endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值