A.计时器,计算A->1就ans++;B->2就ans++,以此类推,做个桶计时
// Problem: A. Problemsolving Log
// Contest: Codeforces - Codeforces Round 916 (Div. 3)
// URL: https://codeforces.com/contest/1914/problem/A
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
//へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
#include <iostream>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int c[N];//int
void solve() {
for(int i=1;i<=26;i++){
c[i]=0;
}
int n;
cin>>n;
string s;
cin>>s;
int ans=0;
for(int i=0;i<n;i++){
c[s[i]-'A'+1]++;
}
for(int i=1;i<=26;i++){
if(c[i]>=i){
ans++;
}
}
cout<<ans<<'\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}
B.排序输入前k个(一个比一个大)后面都小即可.
// Problem: B. Preparing for the Contest
// Contest: Codeforces - Codeforces Round 916 (Div. 3)
// URL: https://codeforces.com/contest/1914/problem/B
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
//へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
#include <iostream>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N];
void solve() {
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
a[i]=i;
}
sort(a+1,a+1+n,greater<int>());
for(int i=k+1;i>=1;i--){
cout<<a[i]<<" ";
}
for(int i=k+2;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<'\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}
C.贪心,边做下一个任务边比对大小.
// Problem: C. Quests
// Contest: Codeforces - Codeforces Round 916 (Div. 3)
// URL: https://codeforces.com/contest/1914/problem/C
// Memory Limit: 256 MB
// Time Limit: 2500 ms
//
// Powered by CP Editor (https://cpeditor.org)
//へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
#include <iostream>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N],b[N];
void solve() {
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
int ans=0;
int res=0;
int mx=0;
for(int i=1;i<=n;i++){
ans+=a[i];
mx=max(mx,b[i]);
if(i<=k){
res=max(res,mx*(k-i)+ans);
}
}
cout<<res<<'\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}
D.排序对前3个a[i],b[i],c[i].求最大ans=a[i]+b[j]+c[k];
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void solve(){
int n;
cin>>n;
vector<pair<int,int> > a,b,c;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a.push_back({x,i});
}
for(int i=1;i<=n;i++){
int x;
cin>>x;
b.push_back({x,i});
}
for(int i=1;i<=n;i++){
int x;
cin>>x;
c.push_back({x,i});
}
sort(a.begin(),a.end(),greater<pair<int,int>>());
sort(b.begin(),b.end(),greater<pair<int,int>>());
sort(c.begin(),c.end(),greater<pair<int,int>>());
int ans=-2;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if(a[i].second!=b[j].second && a[i].second!=c[k].second && b[j].second!=c[k].second){
int res=a[i].first+b[j].first+c[k].first;
ans=max(ans,res);
}
}
}
}
cout<<ans<<'\n';
}
int main(){
int q;
cin>>q;
while(q--){
solve();
}
return 0;
}
D.dfs法待续
E1.dfs法(n<6)
// Problem: E1. Game with Marbles (Easy Version)
// Contest: Codeforces - Codeforces Round 916 (Div. 3)
// URL: https://codeforces.com/contest/1914/problem/E1
// Memory Limit: 256 MB
// Time Limit: 3500 ms
//
// Powered by CP Editor (https://cpeditor.org)
//へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
#include <iostream>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define eps 1e-5
#define INF 1e18
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int n;
struct node{
int x,y;
}a[N];
bitset<N>vis;//bool数组的优化
ll dfs(ll x){
if(x==n){
return 0;
}
ll ans=-INF;
for(int i=1;i<=n;i++){
if(vis[i]){
continue;
}
vis[i]=1;
if(x&1){
ans=max(ans,a[i].y-1-dfs(x+1));
}else{
ans=max(ans,a[i].x-1-dfs(x+1));
}
vis[i]=0;
}
return ans;
}
void solve() {
cin>>n;
for(int i=1;i<=n;i++){
vis[i]=0;
}//初始化
for(int i=1;i<=n;i++){
cin>>a[i].x;
}
for(int i=1;i<=n;i++){
cin>>a[i].y;
}
cout<<dfs(0)<<'\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}
E2.找到正确思路,如果a[1].x+a[1].y>a[2].x+a[2].y,这种排序方式,那么一定是最优解.
// Problem: E2. Game with Marbles (Hard Version)
// Contest: Codeforces - Codeforces Round 916 (Div. 3)
// URL: https://codeforces.com/contest/1914/problem/E2
// Memory Limit: 256 MB
// Time Limit: 3500 ms
//
// Powered by CP Editor (https://cpeditor.org)
//へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
#include <iostream>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
struct node{
int x,y;
int sum;
}a[N];
bool cmp(node a, node b){
return a.sum>b.sum;
}
void solve() {
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x;
}
for(int i=1;i<=n;i++){
cin>>a[i].y;
}
for(int i=1;i<=n;i++){
a[i].sum=a[i].x+a[i].y;
}
sort(a+1,a+1+n,cmp);
ll ans=0;
for(int i=1;i<=n;i++){
if(i&1){
ans+=a[i].x-1;
}else{
ans-=a[i].y-1;
}
}
cout<<ans<<'\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}
文章介绍了四个编程竞赛题目,涉及计数、排序和贪心算法,要求参赛者使用C++解决,包括A题的计数问题、B题的排序特定元素、C题的贪心策略以及D和E题的排序和递归方法。
1731

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



