T1:
贡献一幅解题题图。
按题意模拟即可(不要用数组!)
#include <iostream>
using namespace std;
main() {
int n;
cin>>n;
int d=0;
int ans=-1;
while(n) {//
if(n%3==1 and ans==-1) {
ans=d+1;
// n-=ans;
}
if(n%3!=0) n--;
int f=n/3;//计算被拿走苹果的个数。
n-=f;//算剩下的苹果个数
d++;//日期加一。
}
cout<<d<<" "<<ans;
}
T2:
贪心题。
首先,我们需要计算从当前站点到下一个站点的距离与车每升油可以前进的距离之间的比值。假设这个比值为 x,表示每一升油可以前进 x 公里。
然后,我们从起始站点开始遍历每个站点。在每个站点,我们都会计算当前油箱中的油可以前进的距离 y,如果 y 小于等于当前站点与下一个站点的距离,则说明油不够到达下一个站点,需要在当前站点加油。
为了使得总花费最小,我们选择在当前站点加足够的油,使得油箱中的油可以刚好到达下一个站点。我们需要计算需要加多少升的油,即 (距离与车每升油可以前进的距离之差) / (车每升油可以前进的距离) 的向上取整。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, d;
ll v[100005],w[100005],a[100005],dp[100005],pm[100005];
int main() {
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
cin>>n>>d;
pm[0]=1e18;
for(int i=1;i<n;i++) cin>>v[i];
for(int i=1;i<=n;i++) {
cin>>a[i];
pm[i]=min(pm[i-1],a[i]);
// cout<<pm[i]<<" ";
}
for(int i=2;i<=n;i++) {
dp[i]=dp[i-1]+ceil(1.0*(v[i-1]-w[i-1])/d)*pm[i - 1];
// cout<<dp[i]<<" ";
w[i]=ceil(1.0*(v[i-1]-w[i-1])/d)*d-(v[i-1]-w[i-1]);
}
cout<<dp[n];
return 0;
}
(切记要开 long long)
T3:
模拟一元二次方程的解法即可。。
模拟题(费了我将近 3 个 小时。。。)
#include <bits/stdc++.h>
using namespace std;
int t,m,a,b,c,x,p,q,ggcd,f;
int d;
int gcd(int a1,int a2)
{
int ans=1;
a1=abs(a1);
a2=abs(a2);
while(a1!=1&&a2!=1)
{
if(a1>a2)
{
if(a1%a2==0)
{
ans=a2;
break;
}
else
a1=a1%a2;
}
else
{
if(a2%a1==0)
{
ans=a1;
break;
}
else
a2=a2%a1;
}
}
return ans;
}
int main()
{
// freopen("uqe.in","r",stdin);
// freopen("uqe.out","w",stdout);
cin>>t>>m;
for(int qwq=1;qwq<=t;qwq++)
{
cin>>a>>b>>c;
d=b*b-4*a*c;
if(d<0) {
cout<<"NO\n";
}
else
{
if(sqrt(d)==int(sqrt(d)))
{
p=-b+sqrt(d); q=2*a;
if(q<0)
{
q=-2*a; p=b+sqrt(d);
}
if(p%q==0)
{
cout<<p/q<<endl;
}
else
{
ggcd=gcd(p,q);
p=p/ggcd; q=q/ggcd;
cout<<p<<"/"<<q<<endl;
}
}
else
{
f=1; p=-b; q=2*a;
if(p!=0)
{
if(q<0)
{
q=-2*a; p=b;
}
if(p%q==0)
{
cout<<p/q;
}
else
{
ggcd=gcd(p,q);
p=p/ggcd; q=q/ggcd;
cout<<p<<"/"<<q;
}
cout<<"+";
}
for(int i=2;i*i<=d;i++)
{
if(d%(i*i)==0)
{
f*=i;
d=d/(i*i);
i--;
}
}
q=abs(2*a);
ggcd=gcd(f,q);
f=f/ggcd; q=q/ggcd;
if(f!=1)
{
cout<<f<<"*";
}
cout<<"sqrt("<<d<<")";
if(q!=1)
{
cout<<"/"<<q;
}
cout<<endl;
}
}
}
return 0;
}
T4:
正解应是使用 Dijkstra 算法。。(
代码:
#include<bits/stdc++.h>
#define r(x,y) ((x)*n+(y))
using namespace std;
int const N=1e6+5;
vector<pair<int,int>>to[N];
int dis[N];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
int main() {
// freopen("bus.in","r",stdin);
// freopen("bus.out","w",stdout);
int n,m,k,x,y,z;
cin>>n>>m>>k;
for(int i=1; i<=m; i++) {
cin>>x>>y>>z;
for(int j=0; j<k; j++)
to[r(j,x)].push_back({r((j+1)%k,y),z});
}
for(int i=1; i<=n*k; i++)
dis[i]=1e9;
dis[r(0,1)]=0,q.push({0,r(0,1)});
while(q.size()) {
int now=q.top().second,tmp=q.top().first;
q.pop();
if(tmp>dis[now])
continue;
for(auto tar:to[now]) {
int t=dis[now]+1;
if(dis[now]<tar.second)
t+=((tar.second-dis[now]+k-1)/k)*k;
if(dis[tar.first]>t)
dis[tar.first]=t,q.push({dis[tar.first],tar.first});
}
}
if(dis[r(0,n)]==1e9)
puts("-1");
else
printf("%d\n",dis[r(0,n)]);
return 0;
}