2 svdjasfhiau SVDJASFHIAU 于 2016.04.03 22:10 提问

蓝桥杯算法提高 最大值问题

问题描述
  给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。
输入格式
  输入的第一行为n,数对的个数
  以下n行每行两个整数 ai bi
输出格式
  输出你选定的数对的ai+bi之和
样例输入
5
-403 -625
-847 901
-624 -708
-293 413
886 709
样例输出
1715
数据规模和约定
  1<=n<=100
  -1000<=ai,bi<=1000

下面是我写的 只得了24分

 public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        List<String> lis1=new ArrayList<String>();
        List<String> lis2=new ArrayList<String>();
        int n=sc.nextInt();
        int m=sc.nextInt();
        for(int i=0;i<n;i++){
            lis1.add(sc.next());
        }
        int f=m*2;
        for(int i=0;i<f;i++){
            String s=sc.next();
            if(s.equals("ADD"))f+=1;
            lis2.add(s);
        }
        for(int i=0;i<lis2.size();i++){
            if(lis2.get(i)!=null){
            if(lis2.get(i).equals("DEL")){
                lis1.remove(lis2.get(i+1));
            }
            if(lis2.get(i).equals("ADD")){
                lis1.add(lis1.indexOf(lis2.get(i+1)),lis2.get(i+2));
            }
            }
        }
        System.out.println(lis1.size());
        for (String string : lis1) {
            System.out.print(string+" ");
        }
    }

3个回答

devmiao
devmiao   Ds   Rxr 2016.04.06 17:12
 #include<iostream>
using namespace std;
int a[100],b[100],n;
int res;
int dp(int x,int y,int n)
{
int ret;
if(n==0)
if(x+a[n]>=0&&y+b[n]>=0&&a[n]+b[n]>0)
ret=a[n]+b[n];
else
ret=0;
else if(a[n]+b[n]>0&&x+a[n]>=0&&y+b[n]>=0)
ret=max(dp(x,y,n-1),dp(x+a[n],y+b[n],n-1)+a[n]+b[n]);
else
ret=dp(x,y,n-1);
return ret;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i];
res=dp(0,0,n-1);
cout<<res;
}
SVDJASFHIAU
SVDJASFHIAU 没学过C语言,只懂JAVA
2 年多之前 回复
qq_38077079
qq_38077079   2017.03.26 23:39

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();

int[][] number = new int[n][3];
for(int i=0;i<n;i++){
for(int j=0;j<2;j++){
number[i][j] = input.nextInt();
}
number[i][2] = number[i][0]+number[i][1]; //[ai][bi][ai+bi]
}
//按[ai+bi]的大小将数组number进行排序
for(int i=0;i<=n-2;i++){
int k=i;
for(int j=i+1;j<=n-1;j++){
if(number[j][2]<number[k][2])
k=j;
}
if(k!=i){
int m=number[i][2];
number[i][2]=number[k][2];
number[k][2]=m;
}
}

    int sum=0,count=0,sumAi=0;
    for(int i=n-1;i>=0;i--){
        if(number[i][2]>0){
            count++;
            sumAi += number[i][0];
            if(count==1){
                sum += number[i][2];
                if(number[i-1][2]<=0){
                    System.out.println(sum);
                    break;
                }
            }else{
                if(sumAi>=0){
                    sum += number[i][2];
                    if(number[i-1][2]<=0){
                        System.out.println(sum);
                        break;
                    }
                }else{
                    System.out.println(sum);
                    break;
                }
            }
        }else{
            System.out.println(number[i][2]);
            break;
        }
    }   
}

}

SVDJASFHIAU
SVDJASFHIAU   2016.04.03 22:11

public >
public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

int c=sc.nextInt();

int b[]=new int[c];

int array[]=new int[b.length*2];

for(int i=0;i<(array.length);i++){

    array[i]=sc.nextInt();

}

for(int i=0;i<b.length;i++){

    b[i]=array[(i+1)*2-1]+array[(i+1)*2-2];

}

Arrays.sort(b);

for (int i : b) {

    System.out.println(i);

}

if(c==1)

    if(b[b.length-1]>=0)

        System.out.println(b[b.length-1]);

        else System.out.println();

else

if(b[b.length-1]>=0&&b[b.length-2]>=0)

System.out.println(b[b.length-1]+b[b.length-2]);

else System.out.println();

}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
蓝桥杯 算法提高 求最大值
算法提高 求最大值   时间限制:1.0s   内存限制:256.0MB      问题描述   给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。 输入格式   输入的第一行为n,数对的个数   以下n行每行两个整数 ai bi 输出格式   输出你
蓝桥杯算法提高—种树问题
水题,但是细心!
蓝桥杯 算法提高 P0101(Java解题)
一个水分子的质量是3.0*10-23克,一夸脱水的质量是950克。写一个程序输入水的夸脱数n(0 输入   109.43 输出   3.465283E+027 代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scann
蓝桥杯 算法提高 5-3日历
算法提高 5-3日历   时间限制:1.0s   内存限制:256.0MB      问题描述   已知2007年1月1日为星期一。设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。为完成此函数,设计必要的辅助函数也是必要的。 样例输入 一个满足题目要求的输入范例。 例: 2050 3 样例输出
【蓝桥】算法提高 矩阵乘法
算法提高 矩阵乘法   时间限制:3.0s   内存限制:256.0MB      问题描述   有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。   两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。 输入格式   输入的第一行
蓝桥杯 算法提高3000米排名预测(全排列,dfs,bfs)
算法提高 3000米排名预测 问题描述   3000米长跑时,围观党们兴高采烈地预测着最后的排名。因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别对自己了解的一些运动员的实力作出了评估,即对部分运动员做了相对排名的预测,并且告诉了可怜留守的班长。因为无聊,于是他们就组团去打Dota去了。比赛结束后他们向班长询问最后的排名,但班长不记得了,只记得他们中哪些人的预测是正
蓝桥杯 算法提高 打水问题 逻辑策略 贪心
算法提高 打水问题 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述   N个人要打水,有M个水龙头,第i个人打水所需时间为Ti,请安排一个合理的方案使得所有人的等待时间之和尽量小。 输入格式   第一行两个正整数N M 接下来一行N个正整数Ti。   N,M<=1000,Ti<=1000 输出格式   最小的等待时间之和。(不需要输出具体的安排方案) 样例输
蓝桥杯 算法提高 打水问题 【简单贪心】
算法提高 打水问题 时间限制:1.0s 内存限制:512.0MB 问题描述   N个人要打水,有M个水龙头,第i个人打水所需时间为Ti,请安排一个合理的方案使得所有人的等待时间之和尽量小。 输入格式   第一行两个正整数N M 接下来一行N个正整数Ti。   N,M&amp;lt;=1000,Ti&amp;lt;=1000 输出格式   最小的等待时间之和。(不需要输出具体的...
蓝桥杯 算法提高 最大乘积
算法提高 最大乘积   时间限制:1.0s   内存限制:512.0MB      问题描述   对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式   第一行一个数表示数据组数   每组输入数据共2行:   第1行给出总共的数字的个数n和要取的数的个数m,1   第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值
蓝桥杯算法提高 拿糖果
原题:   算法提高 拿糖果   时间限制:1.0s   内存限制:256.0MB      问题描述   妈妈给小B买了N块糖!但是她不允许小B直接吃掉。   假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。   现在小B希望知道最多可以拿