help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

T1
2. 竞赛真理
题目ID:1306必做题100分
最新提交:
Wrong Answer
50 分
历史最高:
Wrong Answer
50 分
时间限制: 1000ms
空间限制: 65536kB
题目描述
TENSHI在经历了无数次学科竞赛的失败以后,得到了一个真理:做一题就要对一题!但是要完全正确地做对一题是要花很多时间(包括调试时间),而竞赛的时间有限。所以开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的题目用贪心之类的算法随便做做,争取“骗”一点分数。

输入格式:
第一行有两个正整数

N和

T,表示题目的总数以及竞赛的时限(单位秒)。以下的

N行,每行4个正整数

1

W1
i



1

T1
i



2

W2
i



2

T2
i

,分别表示第

i题:完全正确做出来的得分,完全正确做出来所花费的时间(单位秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。

输出格式:
根据每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分,

样例输入:
4 10800
18 3600 3 1800
22 4000 12 3000
28 6000 0 3000
32 8000 24 6000

样例输出:
50
数据范围:
3



30

2



1080000

1


1



2


30000

1


1



2



3≤N≤30,2≤T≤1080000,1≤W1
i

、W2
i

≤30000,1≤T1
i

、T2
i

≤T

时间限制:
1000

空间限制:
65536
代码:

#include <iostream>
#include <vector>
#include <algorithm>

// 定义题目结构体
struct Problem {
    int fullScore;  // 完全正确做出来的得分
    int fullTime;  // 完全正确做出来所花费的时间
    int cheatScore; // “骗”来的分数3的时间
};

// 比较函数,用于排序,优先考虑完全正确做题的性价比
bool cmp(const Problem& a, const Problem& b) {
    double ratioA = static_cast<double>(a.fullScore) / a.fullTime;
    double ratioB = static_cast<double>(b.fullScore) / b.fullTime;
    return ratioA > ratioB;
}

int main() {
    int n, t;
    std::cin >> n >> t;
    std::vector<Problem> problems(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> problems[i].fullScore >> problems[i].fullTime >> problems[i].cheatScore >> problems[i].cheatTime;
    }

    // 先对题目按照完全正确做题的性价比排序
    std::sort(problems.begin(), problems.end(), cmp);

    int score = 0;
    int timeUsed = 0;
    for (const Problem& p : problems) {
        if (timeUsed + p.fullTime <= t) {
            score += p.fullScore;
            timeUsed += p.fullTime;
        } else if (timeUsed + p.cheatTime <= t) {
            score += p.cheatScore;
            timeUsed += p.cheatTime;
        }
    }

    std::cout << score << std::endl;
    return 0;
}//50分

T2
3. 寿司选择
题目ID:15702必做题100分
最新提交:
Wrong Answer
20 分
历史最高:
Wrong Answer
20 分
时间限制: 1000ms
空间限制: 262144kB
题目描述
此方十分喜爱吃寿司。作为一名重度阿宅,出门吃饭是极其困难的。她在手机上选择了一家寿司店,一共有

n种寿司,每个寿司的价格为


a
i

,且只能点一份,起送价为

m元,此方想要知道她最少要花多少钱才能满足起送条件。

输入格式
第一行输入两个整数

(
1



200
)
n(1≤n≤200)和

(
1



50000
)
m(1≤m≤50000)。
第二行输入

n个整数

1
,

2
,
.
.
.
,


(






50000
)
a
1

,a
2

,…,a
n

(m≤∑a
i

≤50000)。

输出格式
输出一个整数,表示满足起送条件的最少花费。

样例
Input 1
3 10
3 7 9
Output 1
10
Input 2
5 12
10 11 7 8 9
Output 2
15
Input 3
3 8
1 6 9
Output 3
9
样例解释
样例1,我们选择价格为
3
3和
7
7的寿司即可满足条件。
样例2,我们选择价格为
7
7和
8
8的寿司,花费了
15
15块,满足条件。
样例3,我们选择价格为
9
9的寿司即可。

数据范围

(
1



200
)
n(1≤n≤200),

(
1



50000
)
m(1≤m≤50000),


(






50000
)
a
i

(m≤∑a
i

≤50000)
代码:

#include<bits/stdc++.h>
using namespace std;
int a[50005],dp[50005];
int main(){
	int n,m,s=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i];
	}
	memset(dp,0x3f3f3f3f,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=n;i++){
		for(int j=s;j>=a[i];j--){
			dp[j]=min(dp[j],dp[j-a[i]]+a[i]);
		}
	}
	for(int i=m;i<=s;i++){
		if(dp[i]!=0x3f3f3f&&dp[i]>=m){
			cout<<dp[i];
			break;
		}
	}
	return 0;
}
//20分

T3

4. 抢劫银行

题目ID:7158拓展题100分

最新提交:

Wrong Answer

0 分

历史最高:

Wrong Answer

0 分

时间限制: 1000ms

空间限制: 512000kB

题目描述

一个劫匪要去抢劫n家银行,每家银行有一定的现金,每抢一家银行该劫匪有一定几率被警察抓住,但是当该劫匪连续作案被抓住的几率小于p时他就可以逃脱,问该劫匪在不被捕的情况下最多能抢到多少钱?

输入格式

第一行为用例组数T,每组用例第一行为一个浮点数P和一个整数n分别表示被捕的几率上限以及该劫匪计划抢劫的银行数量,之后n行每行一个整数M和一个浮点数p表示该家银行的现金数以及该劫匪抢劫该家银行被捕的几率。

0<�≤1000<T≤100

0.0≤�≤1.00.0≤P≤1.0

0<�≤1000<n≤100

0≤��≤1000≤Mj​≤100

0.0≤��≤1.00.0≤pj​≤1.0

输出格式

对于每组用例,输出该劫匪在不被捕的情况最多能抢到多少钱

样例

Input 1

3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05

Output 1

2 4 6
代码:

#include <bits/stdc++.h>
using namespace std;
int t,m,C[10050];
double g[10005],dp[10005],p;
int main() {
	int t,n;
	cin>>t;
	while(t--) {
		memset(dp,0,sizeof(dp));
		memset(g,0,sizeof(g));
		memset(C,0,sizeof(C));
		cin>>p>>n;
		int sum =0;
		for(int i=1; i<=n; i++) {
			cin >>C[i]>>g[i];
			g[i]=1.00-g[i];
			sum +=C[i];
		}
		dp[0]=1;
		for(int i =1; i<=n; i++) {
			for(int j=sum; j>=C[i]; j--) {
				dp[j]=max(dp[j],dp[j-C[i]]*g[i]);
			}
		}
		bool f =0;
		for(int i =sum; i >=0; i--) {
			if(dp[i]>p) {
				cout <<i<<endl;
				f=1;
				break;
			}
		}
		if(f==0) {
			cout<<0<<endl;
		}
	}
	return 0;
}
//0分

T1解出来了

#include <stdio.h>
using namespace std;
int f[1080001];
__attribute__((optimize("02")))
int max(int x,int y)
{
  return x>y?x:y;
}
__attribute__((optimize("02")))
int main(){
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++){
    int v1,w1,v2,w2;
    scanf("%d%d%d%d",&v1,&w1,&v2,&w2);
    for(int j=m;j>=w1+w2-max(w1,w2);j--){
      if(j>=w1)f[j]=max(f[j-w1]+v1,f[j]);
      if(j>=w2)f[j]=max(f[j-w2]+v2,f[j]);
    }
  }
  printf("%d\n",f[m]);
}

T2只要把

改成:

dp[i] != 1061109567

就能AC

111

111

T2

#include<bits/stdc++.h>
using namespace std;
int a[50005],dp[50005];
int main(){
	int n,m,s=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i];
	}
	memset(dp,0x3f3f3f3f,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=n;i++){
		for(int j=s;j>=a[i];j--){
			dp[j]=min(dp[j],dp[j-a[i]]+a[i]);
		}
	}
	for(int i=m;i<=s;i++){
		if(dp[i]!=0x3f3f3f3f&&dp[i]>=m){
			cout<<dp[i];
			break;
		}
	}
	return 0;
}

T3谁会

我会

明显AI代码啊T1

T4有人会吗

有人会T4吗