- 赵一静 的博客
八月暑期集训8月14日DAY9题解
- @ 2024-8-14 19:10:31
小苹果(数学)
思路没想到的原因
我没有看清题目就把代码交上去,导致只有分。
思路
如果最后一个苹果编号等于1,表示本轮被拿走,返回。
否则,递归调用函数,传入作为参数,并将返回结果加。
在主函数中,读入表示初始的苹果数量。
调用函数计算被拿走的苹果个数。
每轮处理,轮数加。
更新苹果数量,每次减去个苹果。
输出总的轮数和第一次选中最后一个的轮数。
代码
#include <bits/stdc++.h>
using namespace std;
int cnt=0;
int solve(int n){
if(n%3==1) return 1;//如果最后一个苹果编号n%3等于1,第一轮肯定被拿走
return solve(n-(n+2)/3)+1;//返回它在分成3个为一组的组里排第几
}
int main(){
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
int n;
cin >>n;
for(int i=n;i>=1;i-=(i-1)/3+1){
cnt++;
}
cout <<cnt<<" "<<solve(n);
return 0;
}
公路(模拟)
思路
首先,我们使用两个数组和来记录站点的信息。数组记录到当前站点的总路程,数组记录每个站点的油价。
接下来,我们读取输入的站点数量和每升油可以让车前进的距离。
然后,使用一个循环来读取每个站点的距离并计算到当前站点的总路程。注意,我们将路程累加到数组中,以便后续计算。
接着,使用另一个循环来读取每个站点的油价。
接下来,我们使用贪心算法来计算最少的加油费用。我们使用两个变量和来记录当前的最低油价和已购买油的体积。
在循环中,我们计算当前需要多少升油,即总路程除以每升油可以前进的距离。如果有余数,表示需要多买一升油。
然后,我们更新当前的最低油价,取当前站点的油价和中的较小值。
接着,计算当前需要购买的油的体积。如果需要的油量大于已购买的油量,说明需要花钱购买更多的油。
最后,将花费的费用累加到中,计算方式为(需要的油-已购的油)乘当前最低油价。
循环结束后,输出最少的加油费用。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int tt=1e5+10;
int v[tt],a[tt];
signed main(){
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int n,d;
cin >>n>>d;
int ans=0;
for(int i=0;i<n-1;i++){
cin >>v[i];
if(i!=0){
v[i]+=v[i-1];//加上前面的距离
}
}
for(int i=0;i<n;i++){
cin >>a[i];
}
int min_n=a[0],cnt=0; //min_n记录当前最低油价,cnt记录已购买油的体积
for(int i=0;i<n-1;i++){
int t=v[i]/d; //计算当前需要多少升油
if(v[i]%d!=0){//有余下来的
t++;//多买一升
}
min_n=min(min_n,a[i]);//当前最低油价
ans+=(t-cnt)*min_n; //(需要的油-已购的油)*当前最低油价
cnt=t;//更新
}
cout <<ans;
return 0;
}
一元二次方程(模拟)
思路没想到的原因
没有一点头绪,但是一道很好的大~~~~~~模拟题。
思路
首先,如果,那么都要取反都乘,的公式题目给了:。
接下来分情况讨论:
-
无实根 ,输出;
-
有实根
(1) ,若,输出结果即可,若无法整除,约分后输出;
(2)
① 是完全平方数,开方后得到,判断,能整除直接输出,否则约分后输出;
② 不是完全平方数,尝试化简为的形式,答案分为两部分:,注意约分,若为,不需要输出号,否则是两部分相加。
代码
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
int k,r;
int gcd(int a,int b){
if(a%b==0){
return b;
}else{
return gcd(b,a%b);
}
}
void solve1(int a,int b){
if((2*a)/abs(gcd(abs(b),abs(2*a)))==1){
cout <<-b/abs(gcd(abs(b),abs(2*a)));
}else{
cout <<-b/abs(gcd(abs(b),abs(2*a)));
cout <<"/";
cout <<(2*a)/abs(gcd(abs(b),abs(2*a)));
}
}
void solve2(int a,int b){
if(b==0){
cout <<"0";
}else{
if((-b)/abs(gcd(abs(b),abs(2*a)))!=1){
cout <<(-b)/abs(gcd(abs(b),abs(2*a)));
cout <<"*";
}
cout <<"sqrt("<<r<<")";
if((2*a)/abs(gcd(abs(b),abs(2*a)))!=1){
cout <<"/";
cout <<2*a/abs(gcd(abs(b),abs(2*a)));
}
}
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin >>t>>m;
while(t--){
int x;
int a,b,c;
cin >>a>>b>>c;
if(a<0){
a*=-1;
b*=-1;
c*=-1;
}
int delta=b*b-4*a*c;
if(delta<0){
cout <<"NO";
}else if(delta==0){
solve1(a,b);
}else{
int t=sqrt(delta);
if(t*t==delta){
t-=b;
solve1(a,-t);
}else{
for(int i=sqrt(delta);i>=1;i--){
if(delta%(i*i)==0){
k=i;
r=delta/(i*i);
break;
}
}
if(b!=0){
solve1(a,b);
cout <<"+";
}
solve2(a,-k);
}
}
cout <<endl;
}
return 0;
}
旅游巴士(图论)
待更新……