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;
}