D02-10题解,按照顺序
原题链接:103601.Y or N2026-02-10 17:40:13
发布于:广东
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
int k;
cin >> s >> k;
for(int i=0;i<s.size();i++){
int mx = i;
for(int j=i+1;j<s.size()&&j<=i+k;j++){
if(s[j]>s[mx]) mx=j
}
for(int j=mx;j>i;j--) swap(s[j],s[j-1]);
k-= mx - i;
}
cout << s;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N][N],pre[N][N];
int cnt[N*N];
int main(){
int n,m,k;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
cin>>k;
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
//创建二维异或前缀和,类似二维前缀和公式
pre[i][j] = pre[i-1][j]^pre[i-1][j-1]^pre[i][j-1]^a[i][j];
cnt[idx++] = pre[i][j];
}
}
//从小到大排序
sort(cnt,cnt+idx);
//输出第k大目标值
cout<<cnt[idx-k];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5+10;
ll a[N],p[N],s[N];
int main(){
int n;cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
p[i] = p[i-1]+a[i];
}
for(int i=n;i>=1;i--){
s[i] = s[i+1] + a[i];
}
for(int i=1;i<=n;i++){
cout << abs(p[i-1]-s[i+1]) <<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =2e5+10;
ll a[N];
int main(){
int n,q;cin>> n >> q;
for(int i=1;i<=n;i++){
cin >> a[i];
}
while(q--){
int x; cin >> x;
int idx = lower_bound(a+1,a+n+1,x)-a;
if(a[idx]!=x) cout << -1<<endl;
else cout << idx << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll a[N],p[N];
int main(){
int n,m;cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
p[i] = p[i-1] + a[i];
}
cin >> m;
while(m--){
ll x;cin >> x;
int idx = upper_bound(p+1,p+n+1,x)-p;
cout << idx-1<<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 100;
int n;
long long tim[N]; // 表示第 i 辆公交车完成 一趟 旅途 所需要花费的时间。
long long totalTrips; // 表示所有公交车 总共 需要完成的旅途数目
bool check(long long x) { // 二分答案 花费的最少时间 x
long long sum = 0;
for (int i = 0; i < n; i++) {
sum += x / tim[i]; // 计算每辆公交车在 x 时间下的旅途数量
}
return sum >= totalTrips; // x时间下的旅途数量 >= totalTrips
}
int main() {
cin >> n >> totalTrips;
for (int i = 0; i < n; i++) {
cin >> tim[i];
}
long long l = 1;
long long r = 1e14;
int ans = 0; // 记录答案
while (l <= r) {
long long mid = (l + r) / 2;
if (check(mid)) {
ans = mid;
r = mid -1;
} else {
l = mid + 1;
}
}
cout << l << "\n";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
ll a[N],b[N];
int main(){
int n,m;cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=m;i++)cin >> b[i];
sort(a+1,a+n+1);
sort(b+1,b+m+1);
ll ans;
for(int i=1;i<=n;i++){
int idx = lower_bound(b+1,b+m+1,a[i]) - b;
ll r = 2e9;
if(idx != m + 1){
r = min(r,b[idx]-a[i]);
}
if(idx != 1){
r = min(r,a[i]-b[idx-1]);
}
ans = max(r,ans);
}
cout << ans;
return 0;
}
区间和,二维前缀和不讲。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll a[N];
int main(){
int n;cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
int l=1,r=n;
ll x=0,y=0,f=0,sumx=0,sumy=0;
while(l<=r){
if(f==0){
sumx+=a[l];
x++;
l++;
if(sumx%7==0) f=1;
}else{
sumy+=a[r];
y++;
r--;
if(sumy%7==0) f=0;
}
}
cout << x << " " << y;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll b[N],a[N];
bool cmp(ll x,ll y){
return x > y;
}
int main(){
ll 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];
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1);
ll ans = 0,l=1,r=1;
while(l<=n && r<=n){
if(a[l]+b[r]>k){
ans += r-1;
l++;
}else{
r++;
}
}
ans += (n-l+1) *n;
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e6+10;
ll a[N];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+n+1);
ll sum,ans=0;
cin >> sum;
for(int i=1;i<=n;i++){
if(sum-a[i]>=0){
sum-=a[i];
ans++;
}else{
break;
}
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005];
int main(){
int t;cin >> t;
while(t--){
ll n,x,y,sum=0;
cin >> n >> x >> y;
for(int i=1;i<=n;i++){
cin >> a[i];
sum+=a[i];
}
sort(a+1,a+n+1);
ll r = sum-x,l = sum-y,ans=0;
for(int i=1;i<=n;i++){
int idx = lower_bound(a+i+1,a+n+1,l-a[i])-a;
int idy = upper_bound(a+i+1,a+n+1,r-a[i])-a;
ans += idy-idx;
}
cout << ans << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e6+10;
ll a[N];
int main(){
int n;cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
ll i=1,j=2,ans=1,cnt=1;
while(j<=n){
if(a[j]-a[j-1]==1){
i++;
j++;
cnt++;
ans = max(cnt,ans);
}else{
j++;
i++;
cnt=1;
}
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e6+10;
ll c[N],a[N],cnt[N];
int main(){
int n;cin >> n;
for(int i=1;i<=n;i++){
int x;cin >> x;
cnt[x]++;
}
ll mn=0;
for(int i=1;i<=N;i++){
if(cnt[i] > 0 && a[i]==0 && a[i-1]==0){
a[i+1] = 1;
}
mn+=a[i];
}
for(int i=1;i<=N;i++){
ll d=cnt[i];
if(cnt[i]!=0){
if(c[i-1]==0 && d>0){
c[i-1]=1;
d--;
}
if(c[i]==0 && d >0){
c[i]=1;
d--;
}
if(c[i+1]==0 && d>0){
c[i+1]=1;
d--;
}
}
}
ll mx=0;
for(int i=0;i<=N;i++){
mx += c[i];
}
cout <<mn << " " << mx;
return 0;
}
这里空空如也
















有帮助,赞一个