找规律发现:
\(n = 1\)时为\(0\);
\(n = 2\)时为\(n\);
\(n > 2\)时为\(2n\);
B. Two Arrays And Swaps【贪心】依次b数组最大的与a数组最小的交换。
C. Board Moves【贪心】【数学】因为\(n\)只能是奇数,所以把集中的点放在正中间即可,然后就是公式推导。
/* n = 7时的情况: 3333333 3222223 3211123 3210123 3211123 3222223 3333333 */ D. Note that the answer exists and unique.【优先队列】【模拟】这题会重载运算符与优先队列的话就只是简单的模拟题:区间大的优先,如果区间大小都一样就按照从左到右的顺序来。
AC代码A
#include<iostream> #include<cstdio> using namespace std; int T, n, m; int main() { scanf("%d", &T); while(T--){ scanf("%d %d", &n, &m); if(n == 1) printf("0\n"); else if(n == 2) printf("%d\n", m); else printf("%d\n", m * 2); } return 0; }B
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int T, n, k; int a[102], b[102]; bool cmp(int a, int b){ return a > b; } int main() { scanf("%d", &T); while(T--){ scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) scanf("%d", &a[i]); for(int i = 0; i < n; i++) scanf("%d", &b[i]); sort(a, a + n); sort(b, b + n, cmp); int tmp = 0; for(int i = 0; i < k; i++){ if(a[i] < b[tmp]){ a[i] = b[tmp++]; } } int ans = 0; for(int i = 0; i < n; i++) { // printf("%d ", a[i]); ans += a[i]; } printf("%d\n", ans); } return 0; }C
#include<iostream> #include<cstdio> using namespace std; typedef long long LL; LL ans[500005]; void build(){ LL t = 1; for(LL i = 1; i <= 500000; i += 2){ if(i == 1) ans[i] = 0; else { ans[i] += ans[i - 2] + ((i * 4 - 4) * t); t++; } } } int main() { build(); int T, n; scanf("%d", &T); while(T--){ scanf("%d", &n); printf("%I64d\n", ans[n]); } return 0; }D
// #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int T, n, tmp; int num[200005]; bool take[200005]; struct node{ int l, r; }; struct node2{ bool operator() (node a, node b){ // 重载运算符 if(a.r - a.l == b.r - b.l) return a.l > b.l; // 如果区间相等,就先从左边开始 return a.r - a.l < b.r - b.l; // 区间大的优先 } }; priority_queue<node, vector<node>, node2> q; void solve(){ while(!q.empty()) q.pop(); // 把上次还没出来的先都出来 q.push({1, n}); while(!q.empty()){ node now = q.top(); q.pop(); if(now.l > now.r) continue ; if(now.l == now.r){ if(num[now.l] != 0) continue ; num[now.l] = tmp++; continue ; } if((now.r - now.l + 1) % 2 == 1){ int mid = (now.r + now.l) / 2; num[mid] = tmp++; q.push({now.l, mid - 1}); q.push({mid + 1, now.r}); } else { int mid = (now.r + now.l - 1) / 2; num[mid] = tmp++; q.push({now.l, mid - 1}); q.push({mid + 1, now.r}); } } } int main() { scanf("%d", &T); while(T--){ scanf("%d", &n); memset(num, 0, sizeof(num)); tmp = 1; solve(); for(int i = 1; i <= n; i++){ if(i != 1) printf(" "); printf("%d", num[i]); } printf("\n"); } return 0; }