A
B
我算出来答案是11027421
k = 11625907.5798
import math
n = 23333333
def aaa(x,n):
y = n-x
return (-1*x*x/n*math.log(x/n,2)-y*y/n*math.log(y/n,2))
i=1
while(i<n):
i+=1
t = aaa(i,n)
if k-0.001<t<k+0.001:
print(i,aaa(i,n))
C
#include<bits/stdc++.h>
using namespace std;
int n,a[10002],b[10002];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
}
int lower = 0,upper = 1000000003;
for(int i=0;i<n;i++){
upper = min(upper,a[i]/b[i]);
lower = max(lower,a[i]/(b[i]+1)+1);
}
cout<<lower<<' '<<upper;
return 0;
}
D
#include<bits/stdc++.h>
using namespace std;
int q,n,t[10],d[10],l[10],cur,cnt;
bool vis[10],findd;
void dfs(){
for(int i=0;i<n;i++){
if(vis[i] || cur>t[i]+d[i])continue;
vis[i]=1;cnt++;int f = cur;
cur=max(cur,t[i])+l[i];
dfs();
vis[i]=0;cnt--;cur=f;
}
if(cnt==n)findd=true;
}
void ttt(){
findd = false;cur = 0;
cin>>n;
for(int i=0;i<n;i++){
cin>>t[i]>>d[i]>>l[i];
}
for(int i=0;i<n;i++){
vis[i]=1;int f = cur;cnt++;
cur = t[i]+l[i];
dfs();
cnt--;cur = f;vis[i]=0;
}
cout<<(findd?"YES":"NO")<<endl;
}
int main(){
cin>>q;
while(q--){
ttt();
}
return 0;
}
E
#include<bits/stdc++.h>
using namespace std;
int n,a[100003],f[100003][10];
int head(int n){
while(n>9){
n/=10;
}
return n;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int j=0;j<=9;j++){
if(j!=a[0]%10)f[0][j]++;
}
for(int i=1;i<n;i++){
for(int j=0;j<=9;j++){
f[i][j] = f[i-1][j]+1;
}
f[i][a[i]%10] = min(f[i][a[i]%10],f[i-1][head(a[i])]);
}
/*for(int i=1;i<n;i++){
for(int j=0;j<=9;j++)cout<<f[i][j]<<' ';
cout<<endl;
}*/
int ans=10000000;
for(int j=0;j<=9;j++)ans = min(ans,f[n-1][j]);
cout<<ans;
return 0;
}
F 岛
这道题不会做。。。。
G
#include<bits/stdc++.h>
using namespace std;
int k;
string s;
char c1,c2;
int a[500003],b[500003],cnt1,cnt2;
int main(){
cin>>k>>s>>c1>>c2;
k-=2;
int m = s.size();
for(int i=0;i<m;i++){
if(s[i]==c1)a[cnt1++]=i;
if(s[i]==c2)b[cnt2++]=i;
}
long long ans=0;
for(int i=0;i<cnt1;i++){
ans += cnt2-(upper_bound(b,b+cnt2,a[i]+k)-b);
}
cout<<ans;
return 0;
}
H
尝试用优先队列没写出来,交了一个暴力
#include<bits/stdc++.h>
using namespace std;
int n,k,arr[500003],fg[500003];
bool ff;
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%d",arr+i);
}
while(k--){
int m = 10000000,index=0;
for(int i=0;i<n;i++){
if(fg[i]!=-1 && arr[i]<m){
m=arr[i];index=i;
}
}
fg[index]=-1;
ff=0;int a;
for(int i=index+1;i<n;i++){
if(fg[i]!=-1){
ff=1;a=i;break;
}
}
if(ff)arr[a]+=arr[index];
ff=0;
for(int i=index-1;i>=0;i--){
if(fg[i]!=-1){
ff=1;a=i;break;
}
}
if(ff)arr[a]+=arr[index];
}
for(int i=0;i<n;i++){
if(fg[i]!=-1){
cout<<arr[i]<<' ';
}
}
return 0;
}