Codeforces Round #690 (Div. 3)
A:
按左右两边依次输出
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int a[N]; void solve() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int l = 1, r = n; for (int i = 1; i <= n; i++) if (i % 2 == 0) printf("%d ",a[r--]); else printf("%d ",a[l++]); printf("\n"); } int main() { int T; scanf("%d",&T); for(int i=1;i<=T;i++) { solve(); } }
B:
因为只能删除一次所以满足条件的情况要没删除的段在2 0 2 0 这5个空隙里面插入的时候才一次删完
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; string s; void solve() { int n; cin>>n; cin>>s; if(n<4) { cout<<"NO"<<endl; return ; } if(s.substr(0,4)=="2020") { cout<<"YES"<<endl; return ; } if(s.substr(n-4)=="2020") { cout<<"YES"<<endl; return ; } if(s.substr(0,1)=="2"&&s.substr(n-3)=="020") { cout<<"YES"<<endl; return ; } if(s.substr(0,2)=="20"&&s.substr(n-2)=="20") { cout<<"YES"<<endl; return ; } if(s.substr(0,3)=="202"&&s.substr(n-1)=="0") { cout<<"YES"<<endl; return ; } cout<<"NO"<<endl; } int main() { int T; scanf("%d",&T); for(int i=1;i<=T;i++) { solve(); } }
C:因为不能重复又要求最小,所以尽量让低位是打数
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; void solve() { int n; cin>>n; string s; if(n<9) { cout<<n<<endl; return ; } for(int i=9;i>=1;i--) { if(n>=i) { s+=(i+'0'); n-=i; } } reverse(s.begin(),s.end()); if(n>0) cout<<"-1"<<endl; else cout<<s<<endl; } int main() { int T; scanf("%d",&T); for(int i=1;i<=T;i++) { solve(); } }
D:
因为每次只能把自己加到与自己相邻的,相当于把一段相邻和,这样就可以转换成把数组分成k段并且这K段的和相等。
暴力就好了
#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int a[N]; void solve() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int sum=0; for(int i=1;i<=n;i++) { sum+=a[i]; } int cnt=1; for(int i=1;i<=n;i++) { if(sum%i!=0) continue; int flag=0,sum1=0,cnt1=0; for(int j=1;j<=n;j++) { sum1+=a[j]; if(sum1==sum/i) cnt1++,sum1=0; else if(sum1>sum/i) flag=1; if(flag==1) break; } if(flag==1) continue; if(cnt1==i) cnt=i; } cout<<n-cnt<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin>>T; for(int i=1;i<=T;i++) { solve(); } }
E:枚举每个点,找到比这个点+k的值大的然后pos--就是小于等于这个值得下标了,然后组合数计算一下就好了,注意init()不要放在solve()里面。。这样会T
#include<bits/stdc++.h> using namespace std; const int N = 3e5+10; const int mod =1e9+7; typedef long long ll; ll a[N]; struct AC { static const int maxn = 2e5+10; ll f[maxn]; void init(int mod){ //预处理阶乘 f[0] = 1; for(int i = 1;i<maxn;i++) f[i] = f[i-1]*i%mod; } ll ksm(ll a,ll b,ll mod){ ll ans = 1; while(b){ if(b&1) ans = ans*a%mod; a = a*a%mod; b>>=1; } return ans; } ll C_mod(ll n,ll m,ll mod){//组合数%mod return f[n] * ksm(f[m] * f[n-m]%mod,mod-2,mod)%mod; } ll lucas_mod(ll n,ll m,ll mod){ return m? C_mod(n%mod,m%mod,mod) * lucas_mod(n/mod,m/mod,mod)%mod : 1; } ll A(ll n, ll r)//排列数 { ll sum = 1; for (int i = 0; i < r; i++) sum *= n-i; return sum; } ll C(ll n,ll K){ //组合数 if(K>n) return 0; if(K > n-K) K = n-K; ll m = 1,s = 1; for(int i = 0;i<K;i++){ m = m*(n-i); s = s*(i+1); } return m/s; } }ac; void solve() { ac.init(mod); int n; ll m,k; scanf("%d%lld%lld",&n,&m,&k); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } sort(a+1,a+n+1); ll sum=0; for(int i=1;i<=n;i++) { ll x=a[i]+k; int pos=upper_bound(a+1,a+n+1,x)-a; pos--; if(pos-i>=m-1) sum+=ac.C_mod(pos-i,m-1,mod); sum%=mod; } printf("%lld\n",sum); } int main() { int T; scanf("%d",&T); for(int i=1;i<=T;i++) { solve(); } }
F:树状数组离散化处理一下左右覆盖就好了
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10; ll tr[N]; ll lowbit(int x) { return x&(-x); } void modify(int x,ll v) { for(int i=x;i<=N;i+=lowbit(i)) tr[i]+=v; } ll query(int x) { ll res=0; for(int i=x;i>=1;i-=lowbit(i)) res+=tr[i]; return res; } int l[N], r[N], a[N], sum[N]; int cnt,n; void solve() { scanf("%d",&n); cnt = 0; for (int i = 1; i <= n; i++) { scanf("%d%d",&l[i],&r[i]); ++cnt; a[cnt] = l[i]; ++cnt; a[cnt] = r[i]; } int len=cnt*2; for (int i = 0; i<=len; i++) sum[i] = tr[i] = 0; sort(a + 1, a + 1 + cnt); cnt = unique(a + 1, a + 1 + cnt) - a - 1; for (int i = 1; i <= n; i++) { l[i] = lower_bound(a + 1, a + 1 + cnt, l[i]) - a; r[i] = lower_bound(a + 1, a + 1 + cnt, r[i]) - a; sum[l[i]]++, sum[r[i] + 1]--; modify(l[i], 1); } for (int i = 1; i <= cnt + 1; i++) sum[i] += sum[i - 1]; ll ans = 0; for (int i = 1; i <= n; i++) { ans = max(sum[l[i]] + query(r[i]) - query(l[i]), ans); } printf("%d\n",n-ans); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { solve(); } return 0; }