问题描述
给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+" ");
}
}
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();
}
}
#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;
}
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;
}
}
}
}