传送门
题解:要使得数组中所有乘积和和为 0 0 0,首先所有的 0 0 0必须要加上 1 1 1,之后再特判下此时的和是否为 0 0 0
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e2+5;
int n,h[N];
int main()
{
rush(){
sc(n);
int add=0,ling=0;
rep(i,1,n){
sc(h[i]);
if(h[i]==0)ling++;
add+=h[i];
}
int ans=ling;
add+=ling;
if(add==0)ans++;
pf(ans);
}
return 0;
}
题解:排序,两中位数相减即可。
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=2e5+5;
int n,a[N];
int main()
{
rush(){
sc(n);
n*=2;
rep(i,1,n)sc(a[i]);
sort(a+1,a+n+1);
pf(a[n/2+1]-a[n/2]);
}
return 0;
}
题解:仔细观察发现规律,先将其都作为二进制看下,发现这个函数的功能就是将 y y y的二进制为 1 1 1的位统一给去除掉,然后就能得到要使得最后的数最大,那么就将哪个数上二进制表示该位为 1 1 1,且在所有数中只出现了一次,那么就把它放到前面即可。
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e5+5;
int n,a[N],f[N][50],cnt[50];
void chu(int x,int i)
{
int tot=0;
while(x){
if(x%2==1)cnt[tot]++;
f[i][tot++]=x%2;
x/=2;
}
}
struct data{
int val,flag;
}datas[N];
bool cmp(data a,data b)
{
if(a.flag!=b.flag)return a.flag>b.flag;
else return a.val>b.val;
}
int main()
{
sc(n);
rep(i,1,n)sc(a[i]),chu(a[i],i);
rep(i,1,n){
int flag=0;
rep(j,0,32){
if(f[i][j]==1&&cnt[j]==1){
flag=j+1;
}
}
datas[i]={a[i],flag};
}
sort(datas+1,datas+n+1,cmp);
rep(i,1,n-1)p_f(datas[i].val);
pf(datas[n].val);
return 0;
}
题解:这个题盲猜了一下,觉得只要一个图形每一条边都必须有一个平行边,可能也就是中心对称图形即可。
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e5+5;
int n;
pii dots[N];
map<pii,int>m;
int main()
{
sc(n);
rep(i,0,n-1)sc2(dots[i].fi,dots[i].se);
rep(i,0,n-1){
int x=(dots[(i+1)%n].fi-dots[i].fi),y=(dots[(i+1)%n].se-dots[i].se);
m[{x,y}]++;
}
bool flag=true;
rep(i,0,n-1){
int x=(dots[(i+1)%n].fi-dots[i].fi),y=(dots[(i+1)%n].se-dots[i].se);
if(!m[{-x,-y}]){
flag=false;
break;
}
}
if(flag)puts("YES");
else puts("NO");
return 0;
}
题解:这个题可以发现的是只要存在逆序的关系,那么我们就可以一直使用题中的那个功能,为了达到时间符合,可以从左到右扫描一遍,时间复杂度也就是 O ( n ) O(n) O(n)。
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e6+5;
int n,len[N];
db a[N],st[N];
int main()
{
sc(n);
rep(i,1,n)scanf("%lf",&a[i]),a[i]=a[i]*1.0;
int tot=0;
rep(i,1,n){
st[++tot]=a[i];
len[tot]=1;
while(tot>1&&st[tot-1]>st[tot]){
st[tot-1]=(st[tot-1]*len[tot-1]+st[tot]*len[tot])/(len[tot-1]+len[tot]);
len[tot-1]+=len[tot];
tot--;
}
}
rep(i,1,tot)rep(j,1,len[i])printf("%.10f\n",st[i]);
return 0;
}