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