原题
A题:
题意就是一串数,相加和乘积不能是0
思路:输入的时候判断0的个数,并和加1,然后输入完之后sum==0就在加一
// I want to AC
#include <vector>
#include<stdio.h>
#include<string.h>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <set>
#include<cstring>
#include<queue>
#include<assert.h>
#define ll long long
#define MODD 1000000007
#define pii pair<int,int>
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
//#define ll long long
using namespace std;
const int maxn = 1e9+7;
#define FOR(i, x, y) for (ll i = (x), _##i = (y); i < _##i; ++i)
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) { x = 1; y = 0; return a; }
ll ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
ll inv(ll a, ll M) {
static ll x, y;
assert(exgcd(a, M, x, y) == 1);
return (x % M + M) % M;
}
//void gcd(ll a,ll b,ll &d,ll &x,ll &y){
// if(!b){
// d=a;x=1;y=0;
// }else{
// gcd(b,a%b,d,y,x);
// y-=x*(a/b);
// }
//}
//ll inv(ll a,ll n){
// ll d,x,y;
// gcd(a,n,d,x,y);
// return d==1?(x+n)%n:-1;
//}
// LL get_inv(LL a, LL M) {
// static LL x, y;
// assert(exgcd(a, M, x, y) == 1);
// return (x % M + M) % M;
// }
//欧拉函数
ll euler(ll n)
{
ll rt = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
rt -= rt / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
rt -= rt / n;
return rt;
}
bool st[1000005];
int primes[50005];
void prime(int n)
{
int cnt =0 ;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
}
for(int j=0;j<cnt&&i*primes[j]<=n;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0)
{
break;
}
}
}
}
vector<int > div(int x){
vector<int > res;
for(int i=1 ;i<=x/i;i++) {
if(x%i==0){
res.push_back(i);
if(i!=x/i) res.push_back(x/i);
}
}
sort(res.begin(), res.end());
return res;
}
ll MOD = 1e9+7;
inline void read(int &x){
x=0;int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int lowbit(int x)
{
return x&(-x);
}
//ll bin(ll x, ll n, ll MOD) {
// ll ret = MOD != 1;
// for (x %= MOD; n; n >>= 1, x = mul(x, x, MOD))
// if (n & 1) ret = mul(ret, x, MOD);
// return ret;
// }
//ll C(ll n, ll m) { // m >= n >= 0
// if (m - n < n) n = m - n;
// if (n < 0) return 0;
// ll ret = 1;
// FOR (i, 1, n + 1)
// ret = ret * (m - n + i) % MOD * bin(i, MOD - 2, MOD) % MOD;
// return ret;
// }
// ll Lucas(ll n, ll m) { // m >= n >= 0
// return m ? C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD : 1;
// }
//double dp[maxn],num[maxn];
//char ch [2500][2500];
int main() {
int n;cin >>n;
while(n--) {
int t; cin >>t;
int z =0 ,f =0 ;
int sum =0 ;int cnt =0 ;
int zz =0;
for(int i=0;i<t;i++){
int kk;cin >>kk;
if(kk==0){
kk++;
zz ++;
}
sum+=kk;
}
// cout<<zz<<" "<<ff<<endl;
if(sum==0 ){
zz++;
}
cout<<zz<<endl;
}
return 0;
}B题
题意:就是把给你的一个数组,分为两个,使其中间值相差最小(中间值就是位于数组的中间)
思路:直接把数组sort,一开始怕超时,但是想了想n*log(n)不能超时,然后就果断用了,直接输出中间两项就行了
// I want to AC
#include <vector>
#include<stdio.h>
#include<string.h>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <set>
#include<cstring>
#include<queue>
#include<assert.h>
#define ll long long
#define MODD 1000000007
#define pii pair<int,int>
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
//#define ll long long
using namespace std;
const int maxn = 1e9+7;
#define FOR(i, x, y) for (ll i = (x), _##i = (y); i < _##i; ++i)
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) { x = 1; y = 0; return a; }
ll ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
ll inv(ll a, ll M) {
static ll x, y;
assert(exgcd(a, M, x, y) == 1);
return (x % M + M) % M;
}
//void gcd(ll a,ll b,ll &d,ll &x,ll &y){
// if(!b){
// d=a;x=1;y=0;
// }else{
// gcd(b,a%b,d,y,x);
// y-=x*(a/b);
// }
//}
//ll inv(ll a,ll n){
// ll d,x,y;
// gcd(a,n,d,x,y);
// return d==1?(x+n)%n:-1;
//}
// LL get_inv(LL a, LL M) {
// static LL x, y;
// assert(exgcd(a, M, x, y) == 1);
// return (x % M + M) % M;
// }
//欧拉函数
ll euler(ll n)
{
ll rt = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
rt -= rt / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
rt -= rt / n;
return rt;
}
bool st[1000005];
int primes[50005];
void prime(int n)
{
int cnt =0 ;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
}
for(int j=0;j<cnt&&i*primes[j]<=n;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0)
{
break;
}
}
}
}
vector<int > div(int x){
vector<int > res;
for(int i=1 ;i<=x/i;i++) {
if(x%i==0){
res.push_back(i);
if(i!=x/i) res.push_back(x/i);
}
}
sort(res.begin(), res.end());
return res;
}
ll MOD = 1e9+7;
inline void read(int &x){
x=0;int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int lowbit(int x)
{
return x&(-x);
}
//ll bin(ll x, ll n, ll MOD) {
// ll ret = MOD != 1;
// for (x %= MOD; n; n >>= 1, x = mul(x, x, MOD))
// if (n & 1) ret = mul(ret, x, MOD);
// return ret;
// }
//ll C(ll n, ll m) { // m >= n >= 0
// if (m - n < n) n = m - n;
// if (n < 0) return 0;
// ll ret = 1;
// FOR (i, 1, n + 1)
// ret = ret * (m - n + i) % MOD * bin(i, MOD - 2, MOD) % MOD;
// return ret;
// }
// ll Lucas(ll n, ll m) { // m >= n >= 0
// return m ? C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD : 1;
// }
//double dp[maxn],num[maxn];
//char ch [2500][2500];
int main() {
int n;cin >>n;
while(n--){
int t;cin >>t;
vector<ll > v;
for(int i=0;i<2*t;i++){
ll kk ; cin >>kk;
v.push_back(kk);
}
sort(v.begin(),v.end());
ll one =0 , two =0 ;
ll sum =0x7f7f7f ;
sum = v[(2*t-1)/2+1] - v[(2*t-1)/2];
cout<<sum<<endl;
}
return 0;
}C题
题意就是通过他给的函数(x|y-y)排出顺序来找出最大的数
思路:因为通过找规律,发现只有最大位置上的1唯一且存在,排在第一剩下随便拍就能得出答案(为啥,是这个,且后面不用管,找一下别的题解的图,本弱鸡不会上传图QAQ)
// I want to AC
#include <vector>
#include<stdio.h>
#include<string.h>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <set>
#include<cstring>
#include<queue>
#include<assert.h>
#define ll long long
#define MODD 1000000007
#define pii pair<int,int>
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
//#define ll long long
using namespace std;
const int maxn = 1e9+7;
#define FOR(i, x, y) for (ll i = (x), _##i = (y); i < _##i; ++i)
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
ll ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
ll inv(ll a, ll M) {
static ll x, y;
assert(exgcd(a, M, x, y) == 1);
return (x % M + M) % M;
}
//void gcd(ll a,ll b,ll &d,ll &x,ll &y){
// if(!b){
// d=a;x=1;y=0;
// }else{
// gcd(b,a%b,d,y,x);
// y-=x*(a/b);
// }
//}
//ll inv(ll a,ll n){
// ll d,x,y;
// gcd(a,n,d,x,y);
// return d==1?(x+n)%n:-1;
//}
// LL get_inv(LL a, LL M) {
// static LL x, y;
// assert(exgcd(a, M, x, y) == 1);
// return (x % M + M) % M;
// }
//欧拉函数
ll euler(ll n) {
ll rt = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
rt -= rt / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
rt -= rt / n;
return rt;
}
bool st[1000005];
int primes[50005];
void prime(int n) {
int cnt =0 ;
for(int i=2; i<=n; i++) {
if(!st[i]) {
primes[cnt++]=i;
}
for(int j=0; j<cnt&&i*primes[j]<=n; j++) {
st[primes[j]*i]=true;
if(i%primes[j]==0) {
break;
}
}
}
}
vector<int > div(int x) {
vector<int > res;
for(int i=1 ; i<=x/i; i++) {
if(x%i==0) {
res.push_back(i);
if(i!=x/i) res.push_back(x/i);
}
}
sort(res.begin(), res.end());
return res;
}
ll MOD = 1e9+7;
inline void read(int &x) {
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int lowbit(int x) {
return x&(-x);
}
//ll bin(ll x, ll n, ll MOD) {
// ll ret = MOD != 1;
// for (x %= MOD; n; n >>= 1, x = mul(x, x, MOD))
// if (n & 1) ret = mul(ret, x, MOD);
// return ret;
// }
//ll C(ll n, ll m) { // m >= n >= 0
// if (m - n < n) n = m - n;
// if (n < 0) return 0;
// ll ret = 1;
// FOR (i, 1, n + 1)
// ret = ret * (m - n + i) % MOD * bin(i, MOD - 2, MOD) % MOD;
// return ret;
// }
// ll Lucas(ll n, ll m) { // m >= n >= 0
// return m ? C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD : 1;
// }
//double dp[maxn],num[maxn];
//char ch [2500][2500];
ll dp[100000]= {0};
int main() {
int n;
cin >>n;
int pos=0;
for(int i=1; i<=n; i++)cin >>dp[i];
for(int i = 40; i>=0; i--) {
int num =0 ;
for(int j=1; j<=n; j++) {
if(((dp[j]>>i) &1)==0)num++;
else {
// cout<<j<<endl;
pos = j;
}
}
// cout<<num<<endl;
if(num==n-1)break;//only
}
//cout<<pos<<endl;
if(pos==0) {
for(int i=1; i<=n; i++) {
if(i!=1)cout<<" ";
cout<<dp[i];
}
cout<<endl;
} else {
cout<<dp[pos];
for(int i=1; i<=n; i++) {
if(i==pos) continue ;
cout<<" "<<dp[i];
}
cout<<endl;
}
return 0;
}D题(赛后补的)
题意很唬人,其实就是让你判断一下这个图形是否可以成为中心对称图形((0,0)版本的)
思路:直接通过中心对称图形的性质来判断即可(这道题是赛后补的,初中的知识,都忘了。。。记录一下中心对称图形的对称中心是所有点相加和/所有个点,通过2*对称中心点-任意坐标点判断)
// I want to AC
#include <vector>
#include<stdio.h>
#include<string.h>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <set>
#include<cstring>
#include<queue>
#include<assert.h>
#define ll long long
#define MODD 1000000007
#define pii pair<int,int>
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
//#define ll long long
using namespace std;
const int maxn = 1e9+7;
#define FOR(i, x, y) for (ll i = (x), _##i = (y); i < _##i; ++i)
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
ll ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
ll inv(ll a, ll M) {
static ll x, y;
assert(exgcd(a, M, x, y) == 1);
return (x % M + M) % M;
}
//void gcd(ll a,ll b,ll &d,ll &x,ll &y){
// if(!b){
// d=a;x=1;y=0;
// }else{
// gcd(b,a%b,d,y,x);
// y-=x*(a/b);
// }
//}
//ll inv(ll a,ll n){
// ll d,x,y;
// gcd(a,n,d,x,y);
// return d==1?(x+n)%n:-1;
//}
// LL get_inv(LL a, LL M) {
// static LL x, y;
// assert(exgcd(a, M, x, y) == 1);
// return (x % M + M) % M;
// }
//欧拉函数
ll euler(ll n) {
ll rt = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
rt -= rt / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
rt -= rt / n;
return rt;
}
bool st[1000005];
int primes[50005];
void prime(int n) {
int cnt =0 ;
for(int i=2; i<=n; i++) {
if(!st[i]) {
primes[cnt++]=i;
}
for(int j=0; j<cnt&&i*primes[j]<=n; j++) {
st[primes[j]*i]=true;
if(i%primes[j]==0) {
break;
}
}
}
}
vector<int > div(int x) {
vector<int > res;
for(int i=1 ; i<=x/i; i++) {
if(x%i==0) {
res.push_back(i);
if(i!=x/i) res.push_back(x/i);
}
}
sort(res.begin(), res.end());
return res;
}
ll MOD = 1e9+7;
inline void read(int &x) {
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int lowbit(int x) {
return x&(-x);
}
//ll bin(ll x, ll n, ll MOD) {
// ll ret = MOD != 1;
// for (x %= MOD; n; n >>= 1, x = mul(x, x, MOD))
// if (n & 1) ret = mul(ret, x, MOD);
// return ret;
// }
//ll C(ll n, ll m) { // m >= n >= 0
// if (m - n < n) n = m - n;
// if (n < 0) return 0;
// ll ret = 1;
// FOR (i, 1, n + 1)
// ret = ret * (m - n + i) % MOD * bin(i, MOD - 2, MOD) % MOD;
// return ret;
// }
// ll Lucas(ll n, ll m) { // m >= n >= 0
// return m ? C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD : 1;
// }
//double dp[maxn],num[maxn];
//char ch [2500][2500];
ll x[100010], y [100010];
int main() {
int n;cin >>n;
ll midx=0 ; ll midy =0 ;
map<pair<ll ,ll> ,int >mp;
for(int i=0;i<n;i++){
cin >>x[i]>>y[i];
x[i]*=n;y[i]*= n;
midx+=x[i];midy+=y[i];
mp[make_pair(x[i],y[i])] =1 ;
}
midx/=n;midy/=n;
for(int i=0;i<n;i++){
if(mp[make_pair(2*midx-x[i],2*midy-y[i])]==0)return cout<<"NO"<<endl,0;
}
cout<<"YES"<<endl;
return 0;
}E题(赛后补的)
题意:就是让你通过题面上说的意思来使这个数组字典序最小
思路:看的大佬的思路,就是从后往前判断,只要当前的数num<之前的一个集合cnt,就把这个num加到这个集合里面,之后的双重for查找(大佬他们写的就不超时,我写的就超时,明明一样的思路qaq)
// I want to AC
#include <vector>
#include<stdio.h>
#include<string.h>
#include <cstring>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <set>
#include<cstring>
#include<queue>
#include<assert.h>
#define ll long long
#define MODD 1000000007
#define pii pair<int,int>
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
//#define ll long long
using namespace std;
const int maxn = 1e6+7;
#define FOR(i, x, y) for (ll i = (x), _##i = (y); i < _##i; ++i)
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
ll ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
ll inv(ll a, ll M) {
static ll x, y;
assert(exgcd(a, M, x, y) == 1);
return (x % M + M) % M;
}
//void gcd(ll a,ll b,ll &d,ll &x,ll &y){
// if(!b){
// d=a;x=1;y=0;
// }else{
// gcd(b,a%b,d,y,x);
// y-=x*(a/b);
// }
//}
//ll inv(ll a,ll n){
// ll d,x,y;
// gcd(a,n,d,x,y);
// return d==1?(x+n)%n:-1;
//}
// LL get_inv(LL a, LL M) {
// static LL x, y;
// assert(exgcd(a, M, x, y) == 1);
// return (x % M + M) % M;
// }
//欧拉函数
ll euler(ll n) {
ll rt = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
rt -= rt / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
rt -= rt / n;
return rt;
}
bool st[1000005];
int primes[50005];
void prime(int n) {
int cnt =0 ;
for(int i=2; i<=n; i++) {
if(!st[i]) {
primes[cnt++]=i;
}
for(int j=0; j<cnt&&i*primes[j]<=n; j++) {
st[primes[j]*i]=true;
if(i%primes[j]==0) {
break;
}
}
}
}
vector<int > div(int x) {
vector<int > res;
for(int i=1 ; i<=x/i; i++) {
if(x%i==0) {
res.push_back(i);
if(i!=x/i) res.push_back(x/i);
}
}
sort(res.begin(), res.end());
return res;
}
ll MOD = 1e9+7;
inline void read(int &x) {
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=f;
}
int lowbit(int x) {
return x&(-x);
}
//ll bin(ll x, ll n, ll MOD) {
// ll ret = MOD != 1;
// for (x %= MOD; n; n >>= 1, x = mul(x, x, MOD))
// if (n & 1) ret = mul(ret, x, MOD);
// return ret;
// }
//ll C(ll n, ll m) { // m >= n >= 0
// if (m - n < n) n = m - n;
// if (n < 0) return 0;
// ll ret = 1;
// FOR (i, 1, n + 1)
// ret = ret * (m - n + i) % MOD * bin(i, MOD - 2, MOD) % MOD;
// return ret;
// }
// ll Lucas(ll n, ll m) { // m >= n >= 0
// return m ? C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD : 1;
// }
//double dp[maxn],num[maxn];
//char ch [2500][2500];
const int N=1e6+1;
long long n,a[N],s,c,p[N],q[N],t;
int main() {
ios::sync_with_stdio(false);
cin >>n;
for(int i=1;i<=n;i++){
cin >>a[i];
// a[i] = a[i-1] + xx;
}
for(int i=1;i<=n;i++)
{
s=a[i],c=1;
while(t&&p[t]*c>=s*q[t])
s+=p[t],c+=q[t--];
p[++t]=s,q[t]=c;
}
for(int i=1;i<=t;i++){
for(int j=1;j<=q[i];j++)
printf("%.10f\n",(double)p[i]/q[i]);
// cout<<endl;
}
return 0;
}
京公网安备 11010502036488号