A - Problemsolving Log
题意:
每个字母出现的次数>=给定时间 误区:在几分钟内解决!=竞赛持续时间
思路:
涉及某值出现了几次 ---- map<int, int>
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
string s;
cin>>n>>s;
map<int,int> mp;
int ans=0;
for(int i=0;i<n;i++)
mp[s[i]-'A']++;
for(int i=0;i<26;++i){
if(mp[i]>=(i+1)) ans++;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test;
cin>>test;while(test--)
solve();
return 0;
}
B - Preparing for the Contest
题意:
找出一个包括全部1~n数字的序列,使得(序列-ab b>a)次数恰好=k
思路:
先正序输出1~k(k-1对),然后从大到小输出剩下的即可
代码:
/*
* @Author :
* @LastEditTime : 2024-01-08 15:46:45
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n,k;cin>>n>>k;
for(int i=1;i<=k;++i) cout<<i<<" ";//k-1对
for(int i=n;i>k;--i) cout<<i<<" "; //1对
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test;
cin>>test;while(test--)
solve();
return 0;
}
C - Quests --- 卡住了 写题不能犹豫,想到一个方法立马验证,不要来回横跳多个方法
题意:
n个任务,第i个任务被完成前提是1~i-1个任务都被完成了至少一次。
每个任务第一次完成和被重复完成得到的奖励值不同
最大完成任务数<=k
思路:
完成任务数k全用上。重复完成哪个任务可以任意从已经被完成的任务中选择->确定完成到哪个任务结束(所有题目都是要求一个确定的边界 或者是一个公式来判断)
代码:
/*
* @Author :
* @LastEditTime : 2024-01-08 16:40:06
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n,k;cin>>n>>k;
vector<int> a(n+1),b(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
int sum=a[1],mb=b[1];
int ans=a[1]+(k-1)*b[1];//易错 初始化的值格外注意!!!
for(int i=2;i<=n&&i<=k;++i){
mb=max(mb,b[i]);//易错
int tmp=sum+a[i]+(k-i)*mb;
ans=max(ans,tmp);
sum+=a[i];
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test;
cin>>test;while(test--)
solve();
return 0;
}
D - Three Activities
题意:
每天都可以从三个项目中选择一个完成,每天个项目的人数不同,要求选择三个不同的天 𝑥,𝑦,𝑧 ,使参加活动的朋友总数( 𝑎𝑥+𝑏𝑦+𝑐𝑧 )达到最大。
思路:
涉及在哪天有多少人--两个值对应=必用pair排序 最大的在前面 三层for循环,每层三次,找到最大的( 𝑎𝑥+𝑏𝑦+𝑐𝑧 ) lambda函数!
代码:
/*
* @Author :
* @LastEditTime : 2024-01-08 17:28:06
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
bool cmp(pi& a,pi& b){
return a.ff>b.ff;
}
void solve(){
int n;cin>>n;
vector<pi> a(n+1),b(n+1),c(n+1);
int ans=0;
for(int i=0;i<n;i++) {cin>>a[i].ff; a[i].ss=i;}
for(int i=0;i<n;i++) {cin>>b[i].ff; b[i].ss=i;}
for(int i=0;i<n;i++) {cin>>c[i].ff; c[i].ss=i;}
sort(a.begin(),a.end(),cmp);
sort(b.begin(),b.end(),cmp);
sort(c.begin(),c.end(),cmp);
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if(a[i].ss!=b[j].ss && a[i].ss!=c[k].ss && b[j].ss!=c[k].ss){
int tmp=a[i].ff+b[j].ff+c[k].ff;
ans=max(ans,tmp);
}
}
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test;
cin>>test;while(test--)
solve();
return 0;
}
E - Game with Marbles --- 博弈论
题意:
一共有n种弹珠,a和b对于每个颜色分别有ai和bi个,a先(a弹出某个色的一个 b对应色的弹珠清零)ans=a珠子总数-b主子总数
思路:
a保留自己多的(选自己最多的色弹-no)->ai与bi的差值影响(no)->一个色要么我选要么你选,我先让你选我再看如果是我选我对结果的影响是多少(a-(ai+bi-2) b-(-ai-bi+2))【并不是答案!所以要用pair存】 ,对ai+bi从大到小排序(两对数据-用pair存) a选奇数,b选偶数。[ans=ai-1 or -(bi-1)]
代码:
/*
* @Author :
* @LastEditTime : 2024-01-08 22:54:46
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n;cin>>n;
vector<int> a(n+1),b(n+1);
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
vector<pi> v(n+1);
for(int i=1;i<=n;i++) v[i].ff=a[i],v[i].ss=b[i];
sort(v.begin(),v.end(),[](pi a,pi b){return a.ff+a.ss>b.ff+b.ss;});
int ans=0;
for(int i=0;i<n;++i) {
if(i%2==0) ans+=v[i].ff-1;
else ans-=v[i].ss-1;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test;
cin>>test;while(test--)
solve();
return 0;
}