A题
题意大概就是按照差的绝对值升序输出。
先将他排序,然后明白最大值与最小值的差的绝对值最大,最大值与次最小值的差的绝对值第二大,次最大值与次最小值的差的绝对值第三大……以此类推
然后从中间开始向两边输出就行。
D题
#include<bits/stdc++.h> using namespace std; //long long per = 31560000; int main() { int t; cin>>t; while(t--) { int n,i,j; cin>>n; int a[n]; for(int i = 0;i < n;i++) cin>>a[i]; sort(a,a+n); for(i = n/2-1,j = n/2;i>=0||j<n;i--,j++) { if(j<n) cout<<a[j]<<" "; if(i>=0) cout<<a[i]<<" "; } cout<<endl; } }
B题
找到不递增部分的与最大值差的最大值来求解
#include<bits/stdc++.h> using namespace std; //long long per = 31560000; int main() { int t; cin>>t; while(t--) { int n,i; cin>>n; int a[n]; for(i = 0;i<n;i++) cin>>a[i]; int mx = a[0]; int del= 0; for(int i = 0;i<n;i++) { if(del<mx-a[i]) del = mx-a[i]; if(mx<a[i]) mx = a[i]; } if(del<1) cout<<0<<endl; else { cout<<int(log2(del)+1)<<endl; } } }C题
n个人,数组中n个元素是这n个人拥有的财富,然后你可以从中挑选出部分人收集起来他们的所有财富,然后给这部分人平分,财富>=x是富人,问通过这种操作,最多多少个富人
#include<bits/stdc++.h> using namespace std; //long long per = 31560000; bool cmp(int x,int y) { return x>y; } int main() { int t; cin>>t; while(t--) { int n,x; cin>>n>>x; int a[n]; int i; for(i = 0;i < n;i++) cin>>a[i]; sort(a,a+n,cmp); int cnt = 0;long long s = 0; for(i = 0;i < n;i++) { if(s+a[i]-x>=0) { s+=a[i]-x; cnt++; } else break; } cout<<cnt<<endl; } }
先将所有怪兽都爆炸之后剩下的血量家和,然后便利找触发点;用数组c来储存收到上一个怪兽爆炸影响之后剩余血量,用sum来存所有都爆炸之后剩余血量和;找触发点的时候,如果对应c为整数就需要从sum中减去,然后加上自己本身的初始血量,如果为负数,就不用考虑c;
#include<bits/stdc++.h> using namespace std; //long long per = 31560000; bool cmp(int x,int y) { return x>y; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; long long a[n],b[n],c[n]; int i; for(i = 0;i < n;i++) cin>>a[i]>>b[i]; long long sum = 0; for(i = 0;i < n;i++) { if(i==0) { c[0] = a[0]-b[n-1]; } else c[i] = a[i]-b[i-1]; if(c[i]>0) sum+=c[i]; } long long s = 1e18; for(i = 0;i < n;i++) { if(c[i]>0) s = min(s,sum-c[i]+a[i]); else s = min(s,sum+a[i]); } cout<<s<<endl; } }
E题
先将数组存起来,然后a数组在输入的时候记录正负数的个数;然后再倒着往前遍历两个数组,如果a[i]>b[i]就看看除了a[i]之外剩下的数字里有没有负数,反之就看看有没有正数。
#include<bits/stdc++.h> using namespace std; //long long per = 31560000; int trip = 1; bool cmp(int x,int y) { return x>y; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; int i; int a[n],b[n]; int z = 0,f = 0; for(i = 0;i < n;i++) { cin>>a[i]; if(a[i]>0) z++; else if(a[i]<0) f++; } for(i = 0;i < n;i++) { cin>>b[i]; } int flag = 1; for(i = n-1;i>=0;i--) { if(a[i]>0) z--; else if(a[i]<0) f--; if(a[i]<b[i]) { if(z>0) continue; else { flag = 0; break; } } else if(a[i]>b[i]) { if(f>0) continue; else { flag = 0; break; } } }if(flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
F题
不想看了,,,,脑容量不太够,,,坐等讲题
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<map> using namespace std; #define inf 0x3f3f3f3f #define ll long long #define mod 1000000007 #define maxn 1000005 ll f[maxn]; void init(){ f[0] = 1; for (int i=1; i<=maxn; ++i) f[i] = f[i-1] * i % mod; } ll fastpow(ll x,ll y){ ll ans=1; ll res=x; while(y){ if(y&1)ans=(ans*res)%mod; res=(res*res)%mod; y>>=1; } return ans; } ll lucas(ll n,ll k){ ll ans=1; while(n&&k){ ll nn=n%mod; ll kk=k%mod; if(nn<kk)return 0; ans=ans*f[nn]*fastpow(f[kk]*f[nn-kk]%mod,mod-2)%mod; n/=mod;k/=mod; } return ans; } int main(){ int n; int a[200005]={0}; map<long long int,long long int>mp; mp[0]=0; scanf("%d",&n); int flag=0; long long int sum=-1;//因为57行必须初始设定sum=-1 for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } long long int item=0,sum2=0; for(int i=1;i<=n;i++){ item+=a[i]; if(mp.find(item)!=mp.end()){ sum=max(sum,mp[item]); } mp[item]=i; sum2+=(i-(sum+1)); } printf("%lld\n",sum2); }