2020 年 “联想杯”全国高校程序设计在线邀请赛暨第三届上海理工大学程序设计竞赛(A~C)
A. Archmage
题意:这一题的大概意思是某个法师最多拥有的能力值为n,拥有两项基本的技能:
花费x点的能力值释放一次技能
每秒自动恢复y点能量值,最大不超过n
问在m秒内最多可以释放多少次的技能。
题解:这一题比较有意思,我们这样想:
当恢复的速度大于消耗的速度有:每一秒都可以释放技能,则,ans=m
当消耗的速度大于恢复的速度,则在(m-1)秒内恢复的能量值都可以被用上,则此时有:
ans=min((n+(m-1)*y)/x,m);
注意:暴力会超时,
代码:
#include<iostream> #include<cstring> #include<algorithm> #define ll long long using namespace std; int main(){ ll n,m,x,y; int t; cin>>t; while(t--){ cin>>n>>m>>x>>y; ll t1=(n+(m-1)*y)/x; cout<<min(t1,m)<<endl; } return 0; }
B. Bamboo Leaf Rhapsody
题意:题意简单。
题解:分别求sqrt(x*x+y*y+z*z)的最小值。
代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; int main(){ int n; int x,y,z; cin>>n; double num[100000]={0}; int t=0; for(int i=0;i<n;i++){ cin>>x>>y>>z; double temp=sqrt(x*x+y*y+z*z); num[t++]=temp; } sort(num,num+t); printf("%.3lf\n",num[0]); return 0; }
C. Cheat Sheet
题意:一张纸可以写入n个字符,给出m个字符串(可能有重复),两个字符串中有一个空格,问最后可以写上多少个不同的字符串。
题解:题意简单,简单计算即可,注意要去重,两个字符串中有一个空格即可。
代码:
#include<iostream> #include<set> #include<algorithm> using namespace std; set<string> st; int main(){ int n,m; string ar; cin>>n>>m; for(int i=0;i<m;i++){ cin>>ar; st.insert(ar); } set<string>::iterator it = st.begin(); int length[100000]={0},t=0; while(it!=st.end()){ string ar=*it; it++; length[t++]=ar.length(); } sort(length,length+t);//从小到大排列; int len_sum[100000]={0}; len_sum[0]=length[0]; for(int i=1;i<t;i++){ len_sum[i]=length[i]+len_sum[i-1]+1; } //限制长度是n; int ans=0; for(int i=0;i<t;i++){ if(len_sum[i]>n){ break; } ans++; } cout<<ans<<endl; return 0; }