C语言题,急!!!可以用点C++,满意加分
问题描述:操场上有n堆石子排成一列,k个小朋友在玩游戏,他们每个人可以取连续的若干堆,且每个小朋友最多可以取m堆石子,编程计算他们最多一共能取到多少石子。输入格式:第一行...
问题描述:
操场上有n堆石子排成一列,k个小朋友在玩游戏,他们每个人可以取连续的若干堆,且每个小朋友最多可以取m堆石子,编程计算他们最多一共能取到多少石子。
输入格式:
第一行为正整数n(≤50000)、m(≤n/k)和k(≤10);第二行为n个正整数pi(≤100),分别表示每堆石子的石子数。
输出格式:
输出一个正整数,表示小朋友们一共取到石子数的最大值。
样例输入
7 2 3
35 40 50 10 30 45 60
样例输出
240 展开
操场上有n堆石子排成一列,k个小朋友在玩游戏,他们每个人可以取连续的若干堆,且每个小朋友最多可以取m堆石子,编程计算他们最多一共能取到多少石子。
输入格式:
第一行为正整数n(≤50000)、m(≤n/k)和k(≤10);第二行为n个正整数pi(≤100),分别表示每堆石子的石子数。
输出格式:
输出一个正整数,表示小朋友们一共取到石子数的最大值。
样例输入
7 2 3
35 40 50 10 30 45 60
样例输出
240 展开
2个回答
展开全部
#include<iostream>
using namespace std;
int stones[50000];
bool mark[50000];
int n,m,k;
int findMax(){
int ans=0;
int max=0;
for(int i=0;i+m-1<n;++i){
if(mark[i])
continue;
int temp=0;
int j=0,l=i;
while(j<m && l<n){
if(!mark[l]){
temp+=stones[l];
j++;
}
l++;
}
if(temp>max){
ans=i;
max=temp;
}
}
return ans;
}
int main(){
while(cin>>n>>m>>k){
for(int i=0;i<n;++i){
cin>>stones[i];
mark[i]=false;
}
int total=0;
for(int i=0;i<k;++i){
int p=findMax();
int j=0;
while(j<m && p<n){
if(!mark[p]){
mark[p]=true;
total+=stones[p];
j++;
}
p++;
}
}
cout<<total<<endl;
}
}
展开全部
#include <stdio.h>
int n=7;
int m=2;
int k=3;
int p[]={35,40,50,10,30,45,60};
int max=0;
void getmax(int ii,int kk,int mm){
int i;
kk--;
mm+=p[ii];
if(kk==0 || ii==n-1){
if(max<mm) max=mm;
return;
}
for(i=ii+m;i<n;i++) getmax(i,kk,mm);
}
main(){
int i,j;
n-=(m-1);
for(i=0;i<n;i++){
for(j=1;j<m;j++) p[i]+=p[i+j];
}
for(i=0;i<=n-k*(m-1);i++) getmax(i,k,0);
printf("max=%d\n",max);
}
int n=7;
int m=2;
int k=3;
int p[]={35,40,50,10,30,45,60};
int max=0;
void getmax(int ii,int kk,int mm){
int i;
kk--;
mm+=p[ii];
if(kk==0 || ii==n-1){
if(max<mm) max=mm;
return;
}
for(i=ii+m;i<n;i++) getmax(i,kk,mm);
}
main(){
int i,j;
n-=(m-1);
for(i=0;i<n;i++){
for(j=1;j<m;j++) p[i]+=p[i+j];
}
for(i=0;i<=n-k*(m-1);i++) getmax(i,k,0);
printf("max=%d\n",max);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询