NC206573. 分水果
描述
输入描述
第一行一个整数T(1≤T≤500),表示共有T组测试数据。对于每组测试数据,第一行一个整数n(1≤n≤10000)表示有n个同学,第二行有n个ai(1≤ai≤10000)表示每名同学的成绩
输出描述
输出一个一个整数表示至少需要分配多少个苹果。
示例1
输入:
2 2 1 2 3 1 2 3
输出:
3 6
说明:
C(clang 3.9) 解法, 执行用时: 288ms, 内存消耗: 484K, 提交时间: 2020-06-07 13:41:18
#include<stdio.h> int max(int a,int b){ return a>b?a:b; } int main(){ int T; scanf("%d",&T); int sum[505]={0}; int i,t=T,idx=1; int n,a[10005],b[10005]; while(t--){ scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } b[1]=1; for(i=2;i<=n;i++){ if(a[i]>a[i-1]){ b[i]=b[i-1]+1; } else{ b[i]=1; } } for(i=n-1;i>=1;i--){ if(a[i]>a[i+1]){ b[i]=max(b[i],b[i+1]+1); } } for(i=1;i<=n;i++){ sum[idx]+=b[i]; } idx++; } for(i=1;i<=T;i++){ printf("%d\n",sum[i]); } }
C++14(g++5.4) 解法, 执行用时: 714ms, 内存消耗: 484K, 提交时间: 2020-06-08 09:12:05
#include<bits/stdc++.h> using namespace std; int a[10010],b[10010]; int main() { int t,n,i;cin>>t; while(t--) { cin>>n; for(i=1;i<=n;i++) cin>>a[i],b[i]=1; for(i=2;i<=n;i++) if(a[i-1]<a[i])b[i]=b[i-1]+1; for(i=n;i>=2;i--) if(a[i-1]>a[i]&&b[i]+1>b[i-1])b[i-1]=b[i]+1; int s=0; for(i=1;i<=n;i++) s+=b[i]; cout<<s<<endl; } }
C++11(clang++ 3.9) 解法, 执行用时: 800ms, 内存消耗: 11512K, 提交时间: 2020-06-08 15:38:11
#include<bits/stdc++.h> using namespace std; int a[10010],b[10010]; int main() { int t,n; cin>>t; while(t--) { int sum=0; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; b[i]=1; } for(int i=n-1;i>=1;i--) if(a[i]<a[i-1]) b[i-1]=b[i]+1; for(int i=0;i<n-1;i++) if(a[i]<a[i+1]&&b[i]+1>b[i+1]) b[i+1]=b[i]+1; for(int i=0;i<n;i++) sum+=b[i]; cout<<sum<<'\n'; } return 0; }