A
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mst(a, b) memset(a, b, sizeof a)
#define pb push_back
const int qq = 1e5 + 10;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
int num[qq];
int main() {
int n, t; scanf("%d%d", &n, &t);
int ans = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", num + i);
}
for(int i = 1; i <= n; ++i) {
t -= (86400 - num[i]);
if(t <= 0) {
ans = i;
break;
}
}
printf("%d\n", ans);
return 0;
}B
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mst(a, b) memset(a, b, sizeof a)
#define pb push_back
const int qq = 1e5 + 10;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
int main() {
int n, k; scanf("%d%d", &n, &k);
int sum = 0;
for(int x, i = 1; i <= n; ++i) {
scanf("%d", &x);
sum += x;
}
if(sum + n - 1 == k) {
puts("YES");
} else {
puts("NO");
}
return 0;
}C
可以改变两次要求可达的点对最大,分析可知我们把两个最大的圈连在一起即可达到最大
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mst(a, b) memset(a, b, sizeof a)
#define pb push_back
const int qq = 1e5 + 10;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
LL circle[qq];
bool vis[qq];
int a[qq];
int main() {
int n; scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", a + i);
}
int k = 0;
for(int i = 1; i <= n; ++i) {
if(!vis[i]) {
int p = i;
int cnt = 0;
while(!vis[p]) {
vis[p] = true;
p = a[p];
cnt++;
}
circle[k++] = cnt;
}
}
sort(circle, circle + k);
if(k == 1) {
printf("%lld\n", circle[0] * circle[0]);
} else {
LL sum = 0;
for(int i = 0; i < k - 2; ++i) {
sum += circle[i] * circle[i];
}
sum += (circle[k - 1] + circle[k - 2]) * (circle[k - 1] + circle[k - 2]);
printf("%lld\n", sum);
}
return 0;
}D
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mst(a, b) memset(a, b, sizeof a)
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define pill pair<int, int>
const int qq = 1e5 + 10;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
priority_queue<LL, vector<LL>, greater<LL> > Q;
int main() {
int n; scanf("%d", &n);
for(int x, i = 1; i <= n; ++i) {
scanf("%d", &x);
Q.push(x);
}
if(n == 1) {
printf("0\n");
return 0;
}
if(n % 2 == 0) Q.push(0);
LL ans = 0;
while(Q.size() > 1) {
LL tmp = Q.top();
Q.pop();
tmp += Q.top();
Q.pop();
tmp += Q.top();
Q.pop();
Q.push(tmp);
ans += tmp;
}
printf("%lld\n", ans);
}
本文提供了四道编程题目的解答思路及代码实现:第一题计算完成任务所需的最小天数;第二题判断序列是否存在特定组合;第三题求解图中最大可达点对;第四题最小化数组元素之和。
1284

被折叠的 条评论
为什么被折叠?



