4 条题解

  • 3
    @ 2023-12-18 20:00:13
    #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
    @ 2024-12-13 18:12:30

    这是一道数学题目,跟着题目模拟递推即可,主要是理解弄清新学单词的数量,复习单词的数量,以及剩余没复习单词的数量之间的关系 第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
      @ 2024-12-14 1:04:57

      `

      #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
        @ 2023-12-18 21:32:21

        #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
        上传者