小苹果(数学)

思路没想到的原因

我没有看清题目就把代码交上去,导致只有2020分。

思路

如果最后一个苹果编号n%3n\%3等于1,表示本轮被拿走,返回11

否则,递归调用solvesolve函数,传入n(n+2)/3n-(n+2)/3作为参数,并将返回结果加11

在主函数中,读入nn表示初始的苹果数量。

调用solvesolve函数计算被拿走的苹果个数。

每轮处理,轮数cntcnt11

更新苹果数量,每次减去(apple+2)/3(apple+2)/3个苹果。

输出总的轮数cntcnt和第一次选中最后一个的轮数solve(n)solve(n)

代码

#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;
}

公路(模拟)

思路

首先,我们使用两个数组vvaa来记录站点的信息。数组vv记录到当前站点的总路程,数组aa记录每个站点的油价。

接下来,我们读取输入的站点数量nn和每升油可以让车前进的距离dd

然后,使用一个循环来读取每个站点的距离并计算到当前站点的总路程。注意,我们将路程累加到数组vv中,以便后续计算。

接着,使用另一个循环来读取每个站点的油价。

接下来,我们使用贪心算法来计算最少的加油费用。我们使用两个变量minnminncntcnt来记录当前的最低油价和已购买油的体积。

在循环中,我们计算当前需要多少升油,即总路程除以每升油可以前进的距离dd。如果有余数,表示需要多买一升油。

然后,我们更新当前的最低油价minnminn,取当前站点的油价和minnminn中的较小值。

接着,计算当前需要购买的油的体积。如果需要的油量大于已购买的油量cntcnt,说明需要花钱购买更多的油。

最后,将花费的费用累加到ansans中,计算方式为(需要的油-已购的油)乘当前最低油价。

循环结束后,输出最少的加油费用ansans

代码

#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;
}

一元二次方程(模拟)

思路没想到的原因

没有一点头绪,但是一道很好的大~~~~~~模拟题。

思路

首先,如果a<0a<0,那么a,b,ca,b,c都要取反\to都乘1-1deltadelta的公式题目给了:delta=b24acdelta=b^2-4ac

接下来分情况讨论:

  1. 无实根 delta<0delta<0,输出NONO

  2. 有实根 delta0delta≥0

    (1) delta=0delta=0,若b2a-b|2a,输出结果即可,若无法整除,约分后输出;

    (2) delta>0delta>0

    deltadelta是完全平方数,开方后b-b得到tt,判断t2at|2a,能整除直接输出,否则约分后输出;

    deltadelta不是完全平方数,尝试化简deltadeltakrk\sqrt{r}的形式,答案分为两部分:b/2a+kr/2a-b/2a+k*\sqrt{r}/2a,注意约分,若bb00,不需要输出++号,否则是两部分相加。

代码

#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;
}

旅游巴士(图论)

待更新……

谢谢