T1T1

考试错误:无。

思路:

思维题,每次减去1/31/3(向上取整),减到00需要的次数就是拿完苹果的天数,中间如果有一次n%3=1n\%3=1,那么nn号苹果被拿走的天数就是当前减的次数

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
	freopen("apple.in","r",stdin);
	freopen("apple.out","w",stdout);
    int n;
    cin >> n;
    int cnt=0,ans=0;
    int flag=1;
    while(n>0){
		cnt++;
        if(n%3==1&&flag){
            flag=0;
            ans=cnt;
        }
        n-=(n+2)/3;
    }
    cout << cnt << " " << ans;
}

T2T2

考试错误:想用tt表示当前买的油的,结果赋值写成+=了。

思路:

贪心+模拟,每次买经过的加油站中最便宜的油即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int v[N],a[N];
int x(auto a,auto b){
	return (a+b-1)/b;
}
signed main(){
	freopen("road.in","r",stdin);
	freopen("road.out","w",stdout);
    int n,d;
    cin >> n >> d;
    for(int i=1;i<n;i++){
        cin >> v[i];
        v[i]+=v[i-1];
    }for(int i=1;i<=n;i++){
        cin >> a[i];
	}
	int m=0;
	int _min=0xffffffff,ans=0;
	int jj=0;
	for(int i=1;i<n;i++){
		int t=v[i]/d;
		_min=min(_min,a[i]);
		if(v[i]%d){
			t++;
		}
		ans+=(t-m)*_min;
		m=t;
	}
	cout << ans;
}

T3T3

考试错误:没写。

思路:

首先,若a0a<0a,b,ca,b,c同乘-11取反(这是为了保证第三句)

接着,定义Δ=b24acΔ = b^2 - 4ac

根据第一句,较大的根 == (b+Δ)/2(−b+Δ)/2

分情况讨论:

  1. 无实根: Δ<0Δ < 0,输出 NO
  2. 有实根: Δ ≥ 0 定义xx (1) Δ=0Δ = 0 x=b/2ax = -b/2a,若b2a-b | 2a,输出结果即可,若无法整除,约分后输出(建议封装成函数,后面会用到) (22) Δ>0Δ > 0 x=(b+Δ)/2a(-b+\sqrt{Δ})/2aΔΔ 是完全平方数,开方后减去 bb 得到 tt,判断 t2at | 2a,能整除直接输出,否则约分后输出 ② ΔΔ 不是完全平方数,尝试化简 ΔΔkrk\sqrt{r} 的形式,答案分为两部分:b/2a+kr/2a-b/2a+k\sqrt{r}/2a(需要约分),若bb00,不需要输出+号。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c;
int trg=b*b-4*a*c;
int k=1,r=trg;
int gcd(int a,int b){
	if(!b) return a;
    return gcd(b,a%b);
}
void solve(int a,int b){
    if(b==0){
        cout << "0";
    }else{
		cout << (b*-1)/gcd(abs(2*a),abs(b));
        if(2*a/gcd(abs(2*a),abs(b))!=1){
        	cout << '/' << 2*a/gcd(abs(2*a),abs(b));
		}
    }
}void solvee(int a,int b){
    if(b==0){
        cout << "0";
    }else{
    	if((b*-1)/gcd(abs(2*a),abs(b))!=1){
    		cout << (b*-1)/gcd(abs(2*a),abs(b));
    		cout << "*";
		}
        cout << "sqrt(" << r << ")";
        if(2*a/gcd(abs(2*a),abs(b))!=1){
        	cout << '/' << 2*a/gcd(abs(2*a),abs(b));
		}
    }
}
signed main(){
	freopen("uqe.in","r",stdin);
	freopen("uqe.out","w",stdout);
    int t,m;
    cin >> t >> m;
    while(t--){
        cin >> a >> b >> c;
		trg=b*b-4*a*c;
		if(a<0){
            a*=-1;
            b*=-1;
            c*=-1;
        }
        if(trg<0) cout << "NO\n";
        else if(trg==0){
            solve(a,b);
            cout << endl;
        }else{
            int t=sqrt(trg);
            if(t*t==trg){
                t-=b;
                solve(a,-1*t);
                cout << endl;
            }else{
                for(int i=sqrt(trg);i>=1;i--){
                    if(trg%(i*i)==0){
                        k=i;
                        r=trg/(i*i);
                        break;
                    }
                }
                if(b){
                    solve(a,b);
                    cout << '+';
                }
                solvee(a,-1*k);
                cout << "\n";
            }
        }
    }
}