A. 小苹果

题目类型:数学

思路

可以发现,其实每一次下来要被拿走的苹果的个数是n1÷3+1(n-1)÷3+1,所以只要nn不为00,那么就要继续,那怎么判断第nn个苹果在这一轮是否被拿走呢?很简单,只要n1(n-1)%3=03=0,那么在这一次,第nn个苹果就要被拿走。

代码

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

B. 公路

题目类型:贪心

思路

实际上这题就是个贪心,我们可以在每次到下一个加油站的时候,比较一下有没有更小的油价,如果有的话,就需要更新油价,然后,我们再将从这个加油站到下一个加油站所需的最小价格用ansans存起来,最后输出即可。

注意:如果要用的油不能把最小的油价整除的话,那么就要将用的油加一升。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N],v[N];
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>>a[i];
		a[i]+=a[i-1];
	}
	int mn=1e9,ans=0,sum=0;
	for(int i=1;i<=n;i++){
		cin>>v[i];
		if(i==n) break;
		mn=min(mn,v[i]);
		int b=a[i]/d;
		if(a[i]%d) b++;
		ans+=(b-sum)*mn;
		sum=b; 
	}
	cout<<ans;
	return 0;
}

代码没写出来,所以就写了个3030分的骗分,下一次一定要好好提升提升代码能力了。