前缀和
牛客-按闹分配
C-按闹分配_2024牛客寒假算法基础集训营1 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,Q,tc;
cin>>n>>Q>>tc;
vector<ll> per(n),sum(n+1);
for(int i=0;i<n;i++){
cin>>per[i];
}
sort(per.begin(),per.end());
for(int i=1;i<=n;i++){
sum[i]=per[i-1]+sum[i-1];
}
while(Q--){
ll M;
cin>>M;
ll x;
x=M/tc;
if(x>=n) {cout<<tc<<endl; continue;}
if(x==0) {cout<<tc+sum[n]<<endl; continue;}
else {cout<<sum[n-x]+tc<<endl; continue;}
}
return 0;
}
用前缀和使最终运算更为简便,但while(Q--)里的代码单独写成solve()再在while调用就会TLE(相当糟心),作为日后TLE后的一种考量。
给一个数组,问你可以求出多少个总和为77777777的子区间
#include<bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while(T--) {
int n;
cin >> n;
vector<int> a(n);
for(int i=0;i<n;i++) {
cin>>a[i];
}
unordered_map<int,int> sc;
int sum=0;
int count=0;
sc[0]=1;
for(int i=0;i<n;i++) {
sum+=a[i];
if(sc.count(sum-7777)) {
count+=sc[sum-7777];
}
sc[sum]++;
}
cout<<count<<endl;
}
return 0;
}
sort降序
G-why买外卖_2024牛客寒假算法基础集训营1 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll n,m,T;
ll x;
pair<int,int> p[N];
bool cmp(pair<int,int>a,pair<int,int>b){
return a.first>b.first;
}//sort降序
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>T;
while(T--){
int cnt=1;
cin>>n>>m;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
if(a>b){
p[cnt].first=a;
p[cnt].second=b;
cnt++;
}
else{
m+=b;
}
}
sort(p+1,p+cnt,cmp);//sort降序
ll sum=0;
for(int i=1;i<cnt;i++){
sum+=p[i].second;
//cout<<sum<<" $$ ";
}
bool flag=0;
for(int i=1;i<cnt;i++){
if(m>=p[i].first-sum){
x=m+sum;
flag=1;
break;
}
else{
sum-=p[i].second;
}
}
if(flag==1) cout<<x<<endl;
else cout<<m<<endl;
}
return 0;
}
string按空格拆开,指定位置读出,删除
#include<bits/stdc++.h>
using namespace std;
int main() {
int T;
cin>>T;
getchar();
while(T--){
string str;
getline(cin,str);//按行读入
int lenth=str.size();
char c=str.at(lenth-1);//c等于str的lenth-1号字符(最后一个
str.pop_back();//删除str的最后一个字符
vector<string> v1;
vector<string> v2;
istringstream in(str);//用于按空格拆string
string t; int cou=0;
while(in>>t){
v1.push_back(t);
cou++;
}//按空格拆开str,再分开存入v1
v2=v1;
reverse(v2.begin(),v2.end());
int ans=0;
for(int i=0;1;i++){
cout<<v1[i]; ans++; if(ans==cou) break; else cout<<" ";
cout<<v2[i]; ans++; if(ans==cou) break; else cout<<" ";
}
cout<<c<<endl;
}
return 0;
}