猴子的正上方,每1米处,都有一个桃子,一共有N个桃子,每个桃子都有其能量值,摘下这个桃子吃下就获得了这个能力值。猴子每跳1米会消耗1个点能量,在能量值允许的下,它可以跳到任何一个可以到达的高度,并且将这个高度及以下高度的桃子摘下吃掉。确保猴子初始的能量一定可以摘下所有的桃子。求该猴子摘下吃掉所有的桃子后,保留最多的能量值
第一行 两个整数N和M,表示桃子的数量和猴子的初始能量
第二行,N个非负整数,依次描述从下向上描述各桃子的能量值。
一个整数,意义如题所述。
2 2 2
1<=N <=2000000
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2000010;
long long n, l, sum[2000010], m, f[maxn];
int q[maxn], front, rear;
struct node {
int v, s;
bool operator < (node rhs)const {
return v-s< rhs.v-rhs.s;
}
};
ll readint() {
ll sum=0;
char ch=getchar();
while(ch>'9'||ch<'0') ch =getchar();
while(ch>='0'&&ch<='9') {
sum = sum*10+ch-'0';
ch=getchar();
}
return sum;
}
priority_queue<node> pq;
int main() {
ll t;
node tmp, top;
n=readint(), m = readint();
for(int i=1; i<=n; i++) {
t=readint();
sum[i]=sum[i-1]+t;
}
tmp.v=m, tmp.s=0;
pq.push(tmp);
ll front=0, rear=1;
for(int i=1; i<=n; i++) {
while(!pq.empty()) {
top = pq.top();
if(top.v<i)
pq.pop();
else
break;
}
f[i] = sum[i]-i+pq.top().v-pq.top().s;
tmp.v=f[i], tmp.s=sum[i];
pq.push(tmp);
}
cout<<f[n];
return 0;
}
某星球发生灾难,他们需要乘坐飞船逃离该星球,该星球有N个居民,已经排好队,要求按照队伍的顺序登船,飞船只能飞行M趟,为了控制成本,需要将飞船的承重设计的尽可能的小;给定N个居民的体重,求飞船的承重。
第一行两个整数N和M,意义如题所述;
第二行,N个整数,表示居民的体重,
一个整数,意义如题所述。
40 30 50 80 100 120 40 60
1<=N<=1000000; 1<=M<=100000;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
long long n, l, num[1000010], m;
bool check(ll mid){
ll cnt=1, sum=0;
for(int i=1; i<=n; i++){
if(num[i]>mid)
return false;
if(sum+num[i]>mid){
cnt++;
sum=num[i];
}else
sum=sum+num[i];
}
return cnt<=m;
}
int main(){
ll L=0, R=0, ans=0;
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>num[i];
R=R+num[i];
}
while(L<=R){
ll mid = (L+R)/2;
if(check(mid)){
ans=mid;
R=mid-1;
}else
L=mid+1;
}
cout<<ans;
return 0;
}
N个钢管,各有各的长度,现在想尽可能焊接成一 根长度为L的旗杆,当然有可能不能正好拼接出这个长度,但是要求尽可能接近这个长度,长一点或短一点也是可以, 请你找出最好的方案。
第一行两个整数, N和L。
第二行N个整数,表示N个钢管的长度。
一个整数,为最佳拼接的长度同期望旗杆长度的差值的绝对值。
3 1 3 5 6
N<=20
#include<bits/stdc++.h>
using namespace std;
int n, l, num[30], ans;
void dfs(int cur, int len){
if(cur>n){
ans=min(ans, abs(len-l));
return;
}
dfs(cur+1, len);
dfs(cur+1, len+num[cur]);
}
int main(){
cin>>n>>l;
for(int i=1; i<=n; i++){
cin>>num[i];
ans+=num[i];
}
ans=max(ans, abs(ans-l));
dfs(1, 0);
cout<<ans;
return 0;
}
给定一个日期,求这一天是当年的第几天。每年的元旦,1月1日,都是每年的第一天,但是每年的最后一天,12月31日,有可能是第365天,也有可能是第366天,因为闰年的二月是29天,平年的二月是28天。一月、三月、五月、七月、八月、十月、十二月都是31天,四月、六月、九月、十一月都是30天。能被4整除但不能被100整除,或者能被400整除的年份为闰年。
一行,包含正整数,它们分别表示年、月、日。
一个整数,为输入所代表的一天在当年的第几天。每年的元旦为一年中的第一天。
#include<bits/stdc++.h>
using namespace std;
int month[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(){
int y, m, d;
cin>>y>>m>>d;
if(y%400==0||y%100!=0&&y%4==0)
month[2]=29;
int ans=0;
for(int i=1; i<m; i++)
ans+=month[i];
ans+=d;
cout<<ans;
return 0;
}
四牌楼青云楼有一个邮票交易市场。给定某一枚邮票连续N天的价格,如果只允许交易一次,即先买入一次,后卖出一次。求最大的利益。没有合适的买入和卖出时机的话,可以不交易,大不了收益为0,也不能做亏本的买卖。低买高卖是交易的原则。
第一行一个整数N。
第二行,N个整数,依次表示第1天~第N天的邮票价格。
一个整数,意义如题所述。
7 1 5 6 4
5 4 3 2 2
1<=N<=1000000
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
int m=0,mn=999999,x;
while(n--){
cin>>x;
mn=min(mn,x);
m=max(m,x-mn);
}
cout<<m;
return 0;
}
爸爸今年继续教育一共三门课程,只要有一门课程不及格,就没有通过学习,后果就是拿不到继续教育证书,给出爸爸三门课程的成绩,判断爸爸是否通过了今年继续教育的学习。三门课都是百分制,小于60分为不及格。
一行,包含三个在0到100之间的整数,分别是三门课程的成绩。
若通过学习输出pass,反之则输出no。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, b, c;
cin>>a>>b>>c;
if(a>=60&&b>=60&&c>=60){
cout<<"pass";
}else
cout<<"no";
return 0;
}