Vj5.26-5.30training
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);
} 