比赛链接:http://codeforces.com/contest/1011
A. Stages
输入n,k,之后输入长度为n的字符串,要求找到一个字典序最短的长度为k的子串,且若字母为c,则之后不可以添入abcd,a=1,b=2,求最小的ans
#include <bits/stdc++.h> using namespace std; int n,k,a[300]={0}; char x; int main() { cin>>n>>k; for(int i=1;i<=n;i++){ cin>>x; a[x-'a'+1]=1; } int p=0,ans=0; for(int i=1;i<=26;i++){ if(p==k) break; if(a[i]) { p++;ans+=i;i++; } } if(p!=k)cout<<-1; else cout<<ans; return 0; }
B. Planning The Expedition
有n个人,m袋食物,每个人只能吃相同的食物(不同的人可以吃不同的),问坚持最长的时间是多少
#include <bits/stdc++.h> using namespace std; int m,n,x,cnt[105]={0}; int main() { ios::sync_with_stdio(false); cin>>m>>n; for(int i=1;i<=n;i++){ cin>>x; cnt[x]++; } int ans; for(int i=n;i>0;i--){ int s=0; for(int j=1;j<=100;j++) s+=cnt[j]/i; if(s>=m){ ans=i; break; } } cout<<ans<<endl; return 0; }
C. Fly
题意:总共有n个星球,飞船从地球起飞经过n-2个星球(在每个星球上做降落、起飞的动作)到达火星,在火星上同样降落起飞,然后直接返回地球做降落。每个星球起飞所需的燃料质量为ai,降落所需要的燃料质量为bi。飞船本身载重为m,附加燃料质量为所求值。问至少需要多少质量的燃料使得地球能做完整的往返运动,精度为1e-6
拿第一组样例来说
11 8
7 5
欲最小,回到起点时候肯定就耗光了汽油,而最后一个待过的机场是 7 机场,因为2*7=12+2,2吨汽油能让他飞14,恰好是飞机重量+耗油重量,依次回推2*8=14+2,16+4=5*4,20+2=11*2
得 x*(a[i]或者b[i])=s+x ,s为下一站油和机身的和,x和具体某个机场的耗油量。
说是数学,其实就是证明下就能发现,无论a[i] b[i]用哪个顺序,最后耗油最小量都一样
注意a[i],b[i]<=1时方程无解的细节!!!
#include <bits/stdc++.h> using namespace std; int n; double m; int a[1050],b[1050]; int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>m; int flag=1; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]<=1) flag=0; } for(int i=1;i<=n;i++) { cin>>b[i]; if(b[i]<=1) flag=0; } if(flag==0) { puts("-1");return 0;} double sum=0,x; for(int i=1;i<=n;i++){ x=m/(a[i]-1),m+=x,sum+=x; x=m/(b[i]-1),m+=x,sum+=x; } printf("%.10f ",sum); return 0; }