Codeforces Round #499 (Div. 2)
Codeforces Round #499 (Div. 2)
https://codeforces.com/contest/1011
A
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,k,i,j,p,r,a[179]; 4 string s; 5 int main(){ 6 for(cin>>n>>k>>s;i<n;i++)a[i]=s[i]-'a'+1; 7 sort(a,a+n); 8 for(i=0,p=-1;i<n&&j<k;i++){ 9 if(p+1<a[i])r+=a[i],j++,p=a[i]; 10 } 11 cout<<(j==k?r:-1); 12 }
B
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,k,i,x,t,l,r,c[179]; 4 int main(){ 5 for(cin>>n>>m;i<m;i++)cin>>x,c[x]++; 6 for(l=0,r=102;(l+r)/2>l;){ 7 k=(l+r)/2; 8 for(t=i=0;i<102;i++)t+=c[i]/k; 9 (t>=n?l:r)=k; 10 } 11 cout<<l; 12 }
C
模拟
题意:从地球飞到火星要经过n-2个星球,最后直接返回地球,每次起飞和降落都需要燃料,且效率不同。火箭重为m,星球数为n,火箭在星球上起飞和降落时的燃料效率ai和bi,求出发时需携带的最小燃料量,若不可行,输出-1。
思路:直接模拟即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define IT set<node>::iterator 6 #define sqr(x) ((x)*(x)) 7 #define pb push_back 8 #define eb emplace_back 9 #define maxn 200005 10 #define eps 1e-8 11 #define pi acos(-1.0) 12 #define rep(k,i,j) for(int k=i;k<j;k++) 13 typedef long long ll; 14 typedef pair<int,int> pii; 15 typedef pair<ll,ll>pll; 16 typedef pair<ll,int> pli; 17 typedef pair<pair<int,string>,pii> ppp; 18 typedef unsigned long long ull; 19 const long long MOD=1e9+7; 20 const double oula=0.57721566490153286060651209; 21 using namespace std; 22 23 int a[1005],b[1005]; 24 25 int main(){ 26 // std::ios::sync_with_stdio(false); 27 int n; 28 double s; 29 cin>>n>>s; 30 int flag=1; 31 for(int i=1;i<=n;i++){ 32 cin>>a[i]; 33 if(a[i]<=1){ 34 flag=0; 35 } 36 } 37 for(int i=1;i<=n;i++){ 38 cin>>b[i]; 39 if(b[i]<=1){ 40 flag=0; 41 } 42 } 43 if(!flag){ 44 cout<<-1; 45 } 46 else{ 47 double ans=0; 48 for(int i=1;i<=n;i++){ 49 double tmp; 50 tmp=s/(a[i]-1); 51 s+=tmp; 52 ans+=tmp; 53 tmp=s/(b[i]-1); 54 s+=tmp; 55 ans+=tmp; 56 } 57 printf("%.7f\n",ans); 58 } 59 }
D
交互题
题意:系统想一个数,你来猜,猜的数比系统想的大,返回1,小则返回-1,猜对了返回0。特殊的是,该系统每隔k次询问会撒一次谎,输出猜对的过程(猜的次数不超过60)
思路:前k次询问先找到系统第一次说谎的时候,剩下的60-k次就二分猜就行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define IT set<node>::iterator 6 #define sqr(x) ((x)*(x)) 7 #define pb push_back 8 #define eb emplace_back 9 #define maxn 200005 10 #define eps 1e-8 11 #define pi acos(-1.0) 12 #define rep(k,i,j) for(int k=i;k<j;k++) 13 typedef long long ll; 14 typedef pair<int,int> pii; 15 typedef pair<ll,ll>pll; 16 typedef pair<ll,int> pli; 17 typedef pair<pair<int,string>,pii> ppp; 18 typedef unsigned long long ull; 19 const long long MOD=1e9+7; 20 const double oula=0.57721566490153286060651209; 21 using namespace std; 22 23 int a[65]; 24 25 int main(){ 26 std::ios::sync_with_stdio(false); 27 int n,m; 28 cin>>m>>n; 29 int x; 30 for(int i=0;i<n;i++){ 31 cout<<1<<endl; 32 cin>>x; 33 if(x==0) return 0; 34 a[i]=x; 35 } 36 int L=0,R=m,mid; 37 for(int i=n;i<60;i++){ 38 mid=L+R>>1; 39 cout<<mid<<endl; 40 cin>>x; 41 if(x==0) return 0; 42 if(x*a[i%n]>0){ 43 L=mid+1; 44 } 45 else{ 46 R=mid-1; 47 } 48 } 49 }
E
题意:有n种价值不同的钞票,每种有无数张。问在k进制下能凑出几种尾数不同的钞票
思路:gcd求最大公约数即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define IT set<node>::iterator 6 #define sqr(x) ((x)*(x)) 7 #define pb push_back 8 #define eb emplace_back 9 #define maxn 200005 10 #define eps 1e-8 11 #define pi acos(-1.0) 12 #define rep(k,i,j) for(int k=i;k<j;k++) 13 typedef long long ll; 14 typedef pair<int,int> pii; 15 typedef pair<ll,ll>pll; 16 typedef pair<ll,int> pli; 17 typedef pair<pair<int,string>,pii> ppp; 18 typedef unsigned long long ull; 19 const long long MOD=1e9+7; 20 const double oula=0.57721566490153286060651209; 21 using namespace std; 22 23 24 int main(){ 25 std::ios::sync_with_stdio(false); 26 int n,k; 27 cin>>n>>k; 28 int a; 29 cin>>a; 30 int gcd=a; 31 for(int i=2;i<=n;i++){ 32 cin>>a; 33 gcd=__gcd(gcd,a); 34 if(gcd==1) break; 35 } 36 gcd=__gcd(gcd,k); 37 int ans=k/gcd; 38 cout<<ans<<endl; 39 for(int i=0;i<ans;i++){ 40 cout<<gcd*i<<" "; 41 } 42 }
F
思维题
题意:给你一颗二叉树,父节点的值等于子节点的值通过“四则运算”得到(XOR,OR,AND,NOT),问每次改变一个叶子节点的值后,根节点的值为多少,每个操作之间互不影响
思路:先跑一遍dfs,求出根结点的值,第二次遍历的时候分类讨论,判断一个节点的值的改变对其父节点有没有影响。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define IT set<node>::iterator 6 #define sqr(x) ((x)*(x)) 7 #define pb push_back 8 #define eb emplace_back 9 #define maxn 1000006 10 #define eps 1e-8 11 #define pi acos(-1.0) 12 #define rep(k,i,j) for(int k=i;k<j;k++) 13 typedef long long ll; 14 typedef pair<int,int> pii; 15 typedef pair<ll,ll>pll; 16 typedef pair<ll,int> pli; 17 typedef pair<pair<int,string>,pii> ppp; 18 typedef unsigned long long ull; 19 const long long MOD=1e9+7; 20 const double oula=0.57721566490153286060651209; 21 using namespace std; 22 23 vector<int>ve[maxn]; 24 int n; 25 struct sair{ 26 string str; 27 int v; 28 }a[maxn]; 29 30 int val[maxn]; 31 int ans[maxn]; 32 int vis[maxn]; 33 34 void dfs1(int pos){ 35 int ans; 36 if(a[pos].str=="AND"){ 37 for(int i=0;i<ve[pos].size();i++){ 38 dfs1(ve[pos][i]); 39 } 40 val[pos]=val[ve[pos][0]]&val[ve[pos][1]]; 41 } 42 else if(a[pos].str=="IN"){ 43 val[pos]=a[pos].v; 44 } 45 else if(a[pos].str=="XOR"){ 46 for(int i=0;i<ve[pos].size();i++){ 47 dfs1(ve[pos][i]); 48 } 49 val[pos]=val[ve[pos][0]]^val[ve[pos][1]]; 50 } 51 else if(a[pos].str=="NOT"){ 52 dfs1(ve[pos][0]); 53 val[pos]=!val[ve[pos][0]]; 54 } 55 else{ 56 for(int i=0;i<ve[pos].size();i++){ 57 dfs1(ve[pos][i]); 58 } 59 val[pos]=val[ve[pos][0]]|val[ve[pos][1]]; 60 } 61 } 62 63 void dfs2(int pos){ 64 int x,y; 65 // cout<<pos<<endl; 66 if(a[pos].str=="IN"){ 67 ans[pos]=!val[1]; 68 } 69 else if(a[pos].str=="AND"){ 70 x=val[ve[pos][0]],y=val[ve[pos][1]]; 71 if(x==0&&y==1){ 72 dfs2(ve[pos][0]); 73 } 74 else if(x==1&&y==0){ 75 dfs2(ve[pos][1]); 76 } 77 else if(x==1&&y==1){ 78 dfs2(ve[pos][0]); 79 dfs2(ve[pos][1]); 80 } 81 } 82 else if(a[pos].str=="OR"){ 83 x=val[ve[pos][0]],y=val[ve[pos][1]]; 84 if(x==1&&y==0){ 85 dfs2(ve[pos][0]); 86 } 87 else if(x==0&&y==1){ 88 dfs2(ve[pos][1]); 89 } 90 else if(x==0&&y==0){ 91 dfs2(ve[pos][0]); 92 dfs2(ve[pos][1]); 93 } 94 } 95 else if(a[pos].str=="XOR"){ 96 x=val[ve[pos][0]],y=val[ve[pos][1]]; 97 if(x==0&&y==0){ 98 dfs2(ve[pos][0]); 99 dfs2(ve[pos][1]); 100 } 101 else if(x==1&&y==1){ 102 dfs2(ve[pos][0]); 103 dfs2(ve[pos][1]); 104 } 105 else if(x==0&&y==1){ 106 dfs2(ve[pos][0]); 107 dfs2(ve[pos][1]); 108 } 109 else if(x==1&&y==0){ 110 dfs2(ve[pos][0]); 111 dfs2(ve[pos][1]); 112 } 113 } 114 else if(a[pos].str=="NOT"){ 115 x=val[ve[pos][0]]; 116 dfs2(ve[pos][0]); 117 } 118 } 119 120 int main(){ 121 std::ios::sync_with_stdio(false); 122 cin>>n; 123 string str; 124 int x,y; 125 for(int i=1;i<=n;i++){ 126 cin>>str>>x; 127 a[i].str=str; 128 if(str=="AND"){ 129 cin>>y; 130 ve[i].pb(x); 131 ve[i].pb(y); 132 a[i].v=0; 133 } 134 else if(str=="IN"){ 135 a[i].v=x; 136 } 137 else if(str=="XOR"){ 138 cin>>y; 139 ve[i].pb(x); 140 ve[i].pb(y); 141 a[i].v=0; 142 } 143 else if(str=="NOT"){ 144 ve[i].pb(x); 145 a[i].v=0; 146 } 147 else{ 148 cin>>y; 149 ve[i].pb(x); 150 ve[i].pb(y); 151 a[i].v=0; 152 } 153 } 154 dfs1(1); 155 for(int i=1;i<=n;i++) ans[i]=val[1]; 156 dfs2(1); 157 for(int i=1;i<=n;i++){ 158 if(a[i].str=="IN"){ 159 cout<<ans[i]; 160 } 161 } 162 cout<<endl; 163 }
posted on 2019-03-26 14:15 Fighting_sh 阅读(154) 评论(0) 编辑 收藏 举报