4 条题解
-
3
#include<iostream> using namespace std; const int N = 1e6 + 10; long long arr[N], brr[N], crr[N], drr[N]; int main() { int n, m; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> arr[i]; brr[i] = arr[i] - brr[i - 1] - drr[i - 1];//新学的=当天学习的-昨天新学的-没有复习的; if (brr[i] < 0)brr[i] = 0;//如果当天学的小于0,则当天新学的为0; if (arr[i] > brr[i - 1] + drr[i - 1])crr[i] = brr[i - 1] + drr[i - 1];//如果当天学的>昨天新学的+昨天未复习的,则当天复习的=昨天新学的+昨天未复习的; else crr[i] = arr[i];//否则,复习的=当天学习的; drr[i] = drr[i - 1] + brr[i - 1] - arr[i];//未复习的=昨天未复习的+昨天新学的-今天学习的; if (drr[i] < 0)drr[i] = 0;//如果未复习的<0,则未复习的=0; } while (m--) { int k; cin >> k; cout << brr[k] << " " << crr[k] << " " << drr[k] <<'\n'; } }
-
2
这是一道数学题目,跟着题目模拟递推即可,主要是理解弄清新学单词的数量,复习单词的数量,以及剩余没复习单词的数量之间的关系 第k天: 今天学的的单词数为x 新学单词的数量:如果x大于等于k-1天新学的单词数+剩余没复习的单词数,那么新学的单词数=x-(k-1天新学的单词数+剩余没复习的单词数),否则等于0。 复习单词的数量:如果x小于k-1天新学的单词+剩余的单词,那么复习单词的数量应该等于x;否则就等于新学的单词+剩余的单词。 没复习单词的数量:如果今天学的的单词数x小于昨天剩余没复习的单词数+昨天新学的单词数那么今天没复习的单词数=昨天剩余没复习的单词数+昨天新学的单词数-x,否则等于0。 得到递推公式,初始化即可 初始化:(定义i为第i天) 当i==1时 newword[i]=words[i]; review[i]=0; left[i]=0; 代码如下:
#include<bits/stdc++.h> using namespace std; #define ll long long ll n,m,k; int main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>m; vector<ll>words(n+1);//单词数数组 vector<ll>newword(n+1);//新学单词数组 vector<ll>review(n+1);//复习单词数组 vector<ll>left(n+1);//剩余单词数组 for(int i=1;i<=n;i++){ cin>>words[i]; //初始化,写外面从i==2开始也可,题目给的天数>=1 if(i==1){ newword[i]=words[i]; review[i]=0; left[i]=0; }else{ //递推公式 newword[i]=max(0ll,words[i]-left[i-1]-newword[i-1]); review[i]=min(left[i-1]+newword[i-1],words[i]); left[i]=max(0ll,left[i-1]+newword[i-1]-words[i]); } } //输出结果,完美~~ for(int i=0;i<m;i++){ cin>>k; cout<<newword[k]<<' '<<review[k]<<' '<<left[k]<<'\n'; } return 0; }
时间复杂度:O(n); 空间复杂度:O(n);
-
0
`
#include<bits/stdc++.h> #define int long long using namespace std; const int inf=0x3f3f3f3f; const int N=1e6+10; int n,m; int total_word[N]; struct node{ int newlearn_word; int review_word; int last_word; }a[N]; void solve() { cin >> n >> m; for(int i=1;i<=n;i++) cin >> total_word[i]; a[1].newlearn_word=total_word[1]; a[1].review_word=0; a[1].last_word=0; for(int i=2;i<=n;i++){ // 如果 今天总共学的单词 < 昨天新学的单词数 + 昨天剩余没复习的单词数, if(total_word[i] < a[i-1].newlearn_word + a[i-1].last_word){ a[i].newlearn_word = 0; // 那么 新学的单词数 == 0。 a[i].review_word = total_word[i]; // 那么 今天复习单词的数量应该 == 今天总共学的单词 a[i].last_word = a[i-1].last_word + a[i-1].newlearn_word - total_word[i]; // 那么 今天没复习的单词数 == 昨天剩余没复习的单词数 + 昨天新学的单词数 - 今天学的的单词数, }else { a[i].newlearn_word = total_word[i] - (a[i-1].newlearn_word + a[i-1].last_word); // 否则 新学的单词数 == 今天总共学的单词 - (昨天新学的单词数+昨天剩余没复习的单词数) a[i].review_word = a[i-1].newlearn_word + a[i-1].last_word; //否则 今天复习单词的数量 == 昨天新学的单词 + 昨天剩余的单词 a[i].last_word = 0; // 否则 今天没复习的单词数 == 0。 } } while(m--){ int k; cin >> k; cout << a[k].newlearn_word << ' ' << a[k].review_word << ' ' << a[k].last_word << '\n'; } } void close(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); } signed main () { close();int T = 1; // cin >> T; while(T--) solve(); return 0; } // 山鸟与鱼不同路,从此山水不相逢。莫问故人长短痛,昨夜星辰皆随风
-
0
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
/char a[55][55];/
/int a[100010];/
int b[1000010][4];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
scanf("%d %d",&n,&m);
for (int i = 1; i <= n; ++i)
{
scanf("%d",&b[i][0]);
}
b[1][1]=b[1][0];//xinxue
b[1][2]=0;//fuxi d e
b[1][3]=0;// sheng yu fu xi de
for (int i = 2; i <= n; ++i)
{ if(b[i][0]<=b[i-1][3]+b[i-1][1])
{
b[i][2]=b[i][0];
b[i][3]=b[i-1][3]+b[i-1][1]-b[i][0];
b[i][1]=0;
}
else {
b[i][1]=b[i][0]-b[i-1][3]-b[i-1][1];
b[i][3]=0;
b[i][2]=b[i-1][3]+b[i-1][1]; }
} for (int i = 0; i < m; ++i) { int x;
scanf("%d",&x);
printf("%d %d %d\n",b[x][1],b[x][2],b[x][3]);
}
return 0; }
- 1
信息
- ID
- 968
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 549
- 已通过
- 84
- 上传者