Codeforces Round #499 (Div. 2) 題解
A
給一堆可用的字母,字母權值等於字母序號(a=1 b=2…),從小到大選一些字母出來排列,但是後一個和前一個至少要隔1個(a可以接c不能接a,b),一共選n個,問最小權值和。標記一下哪些字母出現瞭然後從小到大來一遍就好了。
B
有一些編了號的食物,有一些隊伍要出征,每一隻出征的隊伍出征期間吃的食物的編號要一樣,問最多可以出征幾天。
二分天數,求食物最多可以供應多少支隊伍。
C
有一艘飛船,在n個星球上遨遊,路徑1->2->3-> … ->n->1,離開每個星球和到達每個星球的時候都需要消耗一定的燃料(每個星球引數不同),問開始時至少要帶多少燃料。
二分需要攜帶的燃料數,模擬一遍就完事兒。
D
互動題,1e9的數軸上有一個點,可以詢問一個位置,對於大於小於等於的情況分別給出-1,0,1的答案。但是現在回答器壞了,有一個長度為n的01序列,並且序列無限迴圈,假設當前回答是第i個,如果序列上i是1.正確回答,否則給出正確答案的相反數,不超過60次問出這個點的位置。
注意到n<=30前n次詢問1這個位置,答案肯定是1或者0,0好說,如果是-1,那肯定這個01序列這個位置是0,問n次問出來,後三十次直接二分詢問就可以了。
E
給一個數組,任意選裡面的數,求sum%k有多少種情況,n個數能組成的數一定是這n個數的gcd,由擴充套件歐幾里得擴充套件得來,求gcd注意過濾0,求了n個數gcd還沒完,因為可以%,所以還要跟k求gcd,就是這裡忘了,掛的很慘。
F
給一棵樹,葉子結點是布林值,非葉子節點是邏輯運算子,問按序號從小到大依次對葉子結點值取反之後整棵樹答案是多少(每次只更改一個) 1e6
大概是想了。。20min。先dfs一遍把每個節點初始值算出來,然後第二遍dfs三個東西,當前結點,當前結點為0/1時整棵樹的答案,然後分情況往下傳遞,遇到葉子就可以直接知道答案了。
寫的實在是簡單粗暴 待會優化一下程式碼
這場沒上紫是真的菜。
A
//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
int vis[100];
char s[100];
int main()
{
int n,k;cin>>n>>k;
scanf("%s",s+1);
for(int i=1;i<=n;++i) vis[s[i]-'a'+1]=1;
int c=0,ans=0;
for(int i=1;i<=26;++i) if(vis[i]) {
ans+=i;
if(++c>=k)break;++i;
}
if(c==k) cout<<ans<<endl;
else cout<<-1<<endl;
return 0;
}
B
//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
const int maxn=100+10;
int a[maxn],c[maxn];
int m,n;
inline int check(int mid)
{
int cnt=0;
for(int i=1;i<=100;++i)
{
cnt+=c[i]/mid;
}
return cnt>=m;
}
int main()
{
cin>>m>>n;
rep(i,1,n) {cin>>a[i];++c[a[i]];}
if(m>n) {puts("0");return 0;}
int l=1,r=n/m,mid,ans;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}
C
//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
int n,m;
const int maxn=1000+10;
int a[maxn],b[maxn];
inline int check(double ans)
{
double cur=m+ans;
rep(i,1,n)
{
double t=cur/a[i];
if((cur-=t) < m) return 0;
if(i==n) t=cur/b[1];
else t=cur/b[i+1];
if((cur-=t) < m) return 0;
}
return 1;
}
int main()
{
cin>>n>>m;
rep(i,1,n) cin>>a[i];
rep(i,1,n) cin>>b[i];
double l=0,r=1e9,mid;
if(!check(1e9+1e8)) {puts("-1");return 0;}
while(r-l > 1e-8)
{
mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid;
}
printf("%.8f",(l+r)/2);
return 0;
}
D
//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
int n,m;
const int maxn=30+10;
int tr[maxn];
inline int query(int x){
printf("%d\n",x);fflush(stdout);
int t;cin>>t;return t;
}
int OK=0;
inline int check(int x,int id)
{
int k=query(x);
if(tr[id]==-1) k=-k;
if(k==-1) return 0;
if(k==1) return 1;
OK=1;return 0;
}
int main()
{
cin>>m>>n;
if(m==1) {query(1);return 0;}
rep(i,1,n)
{
tr[i]=query(1);
if(tr[i]==0) return 0;
}
int l=1,r=m,mid,c=0;
while(l<=r)
{
mid=(l+r)>>1;if(++c == n+1) c=1;
if(check(mid,c)) l=mid+1;
else r=mid-1;
if(OK) {return 0;}
}
return 0;
}
E
//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
const int maxn=100000+10;
int a[maxn];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{
int n,k;cin>>n>>k;
rep(i,1,n) {scanf("%d",a+i);a[i]%=k;}
int g=0;
rep(i,1,n){
if(g==0) g=a[i];
else if(a[i]) g=gcd(g,a[i]);
}
if(g==0) {printf("1\n0");return 0;}
g=gcd(g,k);
int sz=(k-1)/g;
cout<<sz+1<<endl;
rep(i,0,sz) printf("%d ",i*g);
return 0;
}
F
//QWsin
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
const int maxn=1000000+10;
char s[maxn][5];
int val[maxn],ch[maxn][2];
int vv[maxn],ans[maxn];
int DFS(int cur)
{
int ret;
if(s[cur][0]=='I') ret= val[cur];
if(s[cur][0]=='A'){
ret= DFS(ch[cur][0]) & DFS(ch[cur][1]);
}
if(s[cur][0]=='O')
{
ret= DFS(ch[cur][0]) | DFS(ch[cur][1]);
}
if(s[cur][0]=='X')
{
ret= DFS(ch[cur][0]) ^ DFS(ch[cur][1]);
}
if(s[cur][0]=='N') ret= !DFS(ch[cur][0]);
vv[cur]=ret;return ret;
}
void dfs(int cur,int ans1,int ans0)
{
int l=ch[cur][0],r=ch[cur][1];
if(s[cur][0]=='I')
{
int t;
if(val[cur]==0) t=ans1;
else t=ans0;
ans[cur]=t;
// printf("%d %d\n",cur,t);
return ;
}
if(s[cur][0]=='A')
{
if(vv[l]==0 && vv[r]==1) {dfs(l,ans1,ans0);dfs(r,ans0,ans0);}
if(vv[l]==1 && vv[r]==0) {dfs(l,ans0,ans0);dfs(r,ans1,ans0);}
if(vv[l]==0 && vv[r]==0) {dfs(l,ans0,ans0);dfs(r,ans0,ans0);}
if(vv[l]==1 && vv[r]==1) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
}
if(s[cur][0]=='O')
{
if(vv[l]==0 && vv[r]==1) {dfs(l,ans1,ans1);dfs(r,ans1,ans0);}
if(vv[l]==1 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans1);}
if(vv[l]==0 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
if(vv[l]==1 && vv[r]==1) {dfs(l,ans1,ans1);dfs(r,ans1,ans1);}
}
if(s[cur][0]=='X')
{
if(vv[l]==0 && vv[r]==1) {dfs(l,ans0,ans1);dfs(r,ans1,ans0);}
if(vv[l]==1 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans0,ans1);}
if(vv[l]==0 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
if(vv[l]==1 && vv[r]==1) {dfs(l,ans0,ans1);dfs(r,ans0,ans1);}
}
if(s[cur][0]=='N') dfs(ch[cur][0],ans0,ans1);
}
int main()
{
int n;cin>>n;
rep(i,1,n)
{
scanf("%s",s[i]);
if(s[i][0]=='I') scanf("%d",val+i);
else if(s[i][0]!='N'){
int a,b;
scanf("%d%d",&a,&b);if(a>b) swap(a,b);
ch[i][0]=a;
ch[i][1]=b;
}
else{
int a;
scanf("%d",&a);
ch[i][0]=a;
}
}
memset(ans,-1,sizeof ans);
vv[1]=DFS(1);
dfs(1,1,0);
for(int i=1;i<=n;++i) if(ans[i]!=-1)printf("%d",ans[i]);
return 0;
}