问题A. Archmage
题解: 这题是求能召唤的水元素球的最大数目,分两大类情况讨论:1. 如果恢复值y>=召唤一个的消耗,那么m次操作都可以召唤,输出m换行;2. 设可以召唤水球的次数为w次,当满足以下条件 n-w*x+(w-1)*y>=0 的时候,第w次方可召唤,化简得w<=(n-y)/(x-y),取边界条件,令 w=(n-y)/(x-y),若w>=m(最大操作次数),则输出m换行,否则计算召唤w次后剩余的法力值和剩余 可释放 回合积累的法力值的和,用这个和与x的商加上w,输出换行。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t,n,m,x,y;
cin>>t;
while(t--)
{
cin>>n>>m>>x>>y;
if(y>=x) printf("%lld\n",m);
else
{
ll w=(n-y)/(x-y);
if(w>=m) printf("%lld\n",m);
else
{
ll res=w;
m-=w;
ll now=n+w*(y-x);
ll s=now+(m-1)*y; //注意是m-1,而不是m,要先满足召唤的条件 (可借鉴不等式理解 )
res+=s/x;
printf("%lld\n",res);
}
}
}
return 0;
}
问题B. Bamboo Leaf Rhapsody
题解:是水题,找最小平方和,控制精度,开根号输出。
#include <bits/stdc++.h>
using namespace std;
int n,a,b,c,minn=1e9;
int main()
{
cin>>n;
while(n--){
int sum=0;
cin>>a>>b>>c;
sum+=a*a+b*b+c*c;
if(sum<=minn) minn=sum;
}
printf("%.3lf",sqrt(minn));
return 0;
}
问题C. Cheat Sheet
题解:抽象一下,固定容量,尽量放多的东西,所以升序排列,具体的看注释。
#include<bits/stdc++.h>
using namespace std;
string s[1001];
int n,m;
bool cmp(string a,string b) { //按字关键词长度升序排序
int la=a.size(),lb=b.size();
if(la==lb) return a<b;
return la<lb;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>s[i];
sort(s+1,s+1+m,cmp);
s[0]="";
int ans, now=2;
//卡一下最基本的条件,若最短的关键词都记不下,作弊同学直接凉凉,输出0换行
if(n>=s[1].size()) {
n-=s[1].size();
ans=1;
}
else {
cout<<0<<endl;
return 0;
}
while(n>0 && now<=m)
{
if(s[now]==s[now-1]) { //前后相同,就往后跳
now++;
continue;
}
int len=s[now].size()+1; //不同就记录下当前单词加上它后面空格的长度
if(n>=len) { //还可以记的话,就继续。更新可用于记录的长度,ans++
n-=len;
ans++;
}
else n=0; //不可以记的话,使循环结束,不用看now了
now++; //依然可以记的情况下,看另一个循环控制变量now【当前检索到的关键词序号】
}
cout<<ans<<endl;
return 0;
}