Codeforces Round #723 (Div. 2)
A
Solution:小到大排序,一前一后作为一对取出来。
Code:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000005
typedef long long ll;
typedef unsigned long long ull;
#define debug(x) cout<<#x<<" :"<<x<<endl
#define debug1(x) cout<<#x<<" :"<<x<<" "
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef double db;
#define eps 1e-8
const db pi=acos(-1);
inline int sgn(db x){//符号函数 0表示0,1表示正数,-1表示负数
if(fabs(x)<eps)return 0;
return x>0?1:-1;
}
inline int dcmp(db x,db y){//比较x和y的大小,0:相等,1为大于,-1为小于
if(fabs(x-y)<eps)return 0;
else return x<y?-1:1;
}
ll qpow(ll a,ll b){
ll ans1=1;
while(b){
if(b&1){
ans1=ans1*a;
}
a=a*a;
b>>=1;
}
return ans1;
}
ll n,m,k;
ll q[MAXN];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
srand(time(NULL));
while(t--){
cin>>n;
rep(i,1,n*2){
cin>>q[i];
}
sort(q+1,q+1+2*n);
rep(i,1,n){
cout<<q[i]<<" "<<q[2*n-i+1]<<" ";
}
cout<<endl;
}
return 0;
}
/*
*/
B
Solution:
观察到\(1111,11111...\)都能被\(11\),\(111\)表示出来,问题转换成一个数是否能被表示成\(x=a*11+b*11\),由表数公式得,\(gcd(11,111)=1\),大于\(11*111-11-111=1099\)的数字必定能被表示出来,剩下的小范围暴力。
Code:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000005
typedef long long ll;
typedef unsigned long long ull;
#define debug(x) cout<<#x<<" :"<<x<<endl
#define debug1(x) cout<<#x<<" :"<<x<<" "
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef double db;
#define eps 1e-8
const db pi=acos(-1);
inline int sgn(db x){//符号函数 0表示0,1表示正数,-1表示负数
if(fabs(x)<eps)return 0;
return x>0?1:-1;
}
inline int dcmp(db x,db y){//比较x和y的大小,0:相等,1为大于,-1为小于
if(fabs(x-y)<eps)return 0;
else return x<y?-1:1;
}
ll qpow(ll a,ll b){
ll ans1=1;
while(b){
if(b&1){
ans1=ans1*a;
}
a=a*a;
b>>=1;
}
return ans1;
}
ll n,m,k;
ll q[MAXN];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
srand(time(NULL));
while(t--){
cin>>n;
if(n>1099){
cout<<"YES"<<"\n";
}
else{
int fg=0;
for(int i=0;i<=100;++i){
if(n>=i*11&&(n-i*11)%111==0){
fg=1;
}
}
cout<<(fg?"YES":"NO")<<"\n";
}
}
return 0;
}
/*
*/
C1/C2
Solution:
反悔贪心。显然整数对答案的贡献一定为加一,考虑负数。维护一个只存负数的小根堆,当前负数能放则放,不能放就把里面最小的取出来替换。
Code:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000005
typedef long long ll;
typedef unsigned long long ull;
#define debug(x) cout<<#x<<" :"<<x<<endl
#define debug1(x) cout<<#x<<" :"<<x<<" "
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef double db;
#define eps 1e-8
const db pi=acos(-1);
inline int sgn(db x){//符号函数 0表示0,1表示正数,-1表示负数
if(fabs(x)<eps)return 0;
return x>0?1:-1;
}
inline int dcmp(db x,db y){//比较x和y的大小,0:相等,1为大于,-1为小于
if(fabs(x-y)<eps)return 0;
else return x<y?-1:1;
}
ll qpow(ll a,ll b){
ll ans1=1;
while(b){
if(b&1){
ans1=ans1*a;
}
a=a*a;
b>>=1;
}
return ans1;
}
ll n,m,k;
ll q[MAXN];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
rep(i,1,n){
cin>>q[i];
}
priority_queue<ll,vector<ll>,greater<ll> >Q;
ll ans=0;
ll sum=0;
rep(i,1,n){
if(q[i]<0){
if(Q.empty()&&sum+q[i]>=0){
Q.push(q[i]);
ans++;
sum=sum+q[i];
}
else if(sum+q[i]>=0){
Q.push(q[i]);
sum+=q[i];
ans++;
}
else if(sum+q[i]<0&&!Q.empty()){
int val=Q.top();
if(val<q[i]){
sum=sum-val+q[i];
Q.pop();
Q.push(q[i]);
}
}
}
else{
sum=sum+q[i];
ans++;
}
}
cout<<ans<<"\n";
return 0;
}
/*
6
8 -8 -2 -2 -2 -2
ans=5
*/
D
Solution:
Wating