16 条题解
-
46
跟L9-4-8一毛一样
只是多了这玩意:
for(int i=1;i<=4;i++)
定义改一下:
int n, s[5], a[21], ans, t[5];
所以 代码长这样:
#include <bits/stdc++.h> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
我怕你说没证据AC: 所以截了屏:
制作不易,点赞拿走
-
26
滴~已查收题解!
#include <iostream> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
-
7
本题相当于把课内的练习8重复做4次。 对每个习题集枚举子集,在子集里和不在子集里的题目,分别分配给两个大脑,计算出两个大脑的时间sum1和sum2,取最大值,即为当前习题集的时间。 4个习题集的时间求总和,即为最终答案。
代码
#include <iostream> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
-
6
P1015
-题目回顾-
这次期末考试,禾木需要考 4 科。因此要开始刷习题集,每科都有一个习题集,分别有 s1,s2,s3,s4道题目,完成每道题目需要一些时间,可能不等
禾木有一个能力,他的左右两个大脑可以同时计算 2 道不同的题目,但是仅限于同一科。因此,禾木必须一科一科的复习。
禾木希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。
-分析-
这道题就是L9-5-8 * 4版本,所以说不过多讲解,不懂的话可以回看一下^_^
-代码-
#include <bits/stdc++.h> using namespace std; int s[10], s1, s2, a[25], sum, ans, x; int main()//by AGOMG { for(int i = 1; i <= 4; i++) cin >> s[i]; for(x = 1; x <= 4; x++) { for (int i = 1; i <= s[x]; i++) { cin >> a[i]; } ans = 1e9; for (int i = 0; i < (1 << s[x]); i++) { int s1 = 0, s2 = 0; for(int j = 0; j < s[x]; j++) { if(i & (1 << j)) { s1 += a[j + 1]; } else { s2 += a[j + 1]; } } ans = min(ans, max(s1, s2)); } sum += ans; } cout << sum; return 0; }
-
5
其实就是一个子集枚举循环四次,每次均取和的最小值,相加即为结果
可以把这一整个问题拆分成四科分步
不多说直接上代码
#include<iostream> using namespace std; int a[5][20],s[5],summ[5]; int review(int x){ int mini=summ[x]; int t=0; for(int i=1;i<(1<<s[x]);i++){ t=0; for(int j=0;j<s[x];j++)if(i&(1<<j))t+=a[x][j]; if(summ[x]-t>t)t=summ[x]-t; if(t<mini)mini=t; if(mini*2==summ[x])return mini; } return mini; } int main(){ int mini=0; for(int i=1;i<=4;i++){ cin>>s[i]; } for(int i=1;i<=4;i++)for(int j=0;j<s[i];j++){ cin>>a[i][j]; summ[i]+=a[i][j]; } for(int i=1;i<=4;i++)mini+=review(i); cout<<mini; return 0; }
其中,
review(int x)
是对第x
门科目的枚举,各门科目均取最小值(同时只能复习一课),相加得到mini即为结果 -
2
#include <iostream> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }// hetao1415825
-
1
#include <iostream> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int ans, s[5], t[5], a[25]; int main() { for ( int i = 1; i <= 4; i ++ ){ cin >> s[i]; t[i] = 10000000; } for ( int i = 1; i <= 4; i ++ ) { for ( int j = 1; j <= s[i]; j ++ ) cin >> a[j]; for ( int j = 0; j < ( 1 << j ); j ++ ) { int sum1 = 0, sum2 = 0; for ( int k = 0; k < s[i]; k ++ ) { if ( j & ( 1 << k ) ) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min( t[i], max( sum1, sum2 ) ); } ans += t[i]; } cout << ans << endl; system("pause"); return 0; }
有没有好同学帮我看看这个代码哪里有问题呀?debug找不出来,样例也过了,但是全WA
-
0
#include <iostream> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
-
-1
#include <bits/stdc++.h> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }
-
-1
备模版即可
//by hetao6640877 #include <bits/stdc++.h> using namespace std; int s[5];//存放四个数字 int a[25],ans; int main(){ for (int i=1;i<=4;i++)cin>>s[i]; for (int i=1;i<=4;i++){ int MAX=0x3f3f3f3f; for (int j=1;j<=s[i];j++)cin>>a[j]; for (int j=0;j<(1<<s[i]);j++){ int sum1=0,sum2=0; for (int k=0;k<s[i];k++){ if (j&(1<<k))sum1+=a[k+1]; else sum2+=a[k+1]; } MAX=min(MAX,max(sum1,sum2)); } ans+=MAX; } cout<<ans; return 0; }
-
-1
#include <bits/stdc++.h> using namespace std; int cal(int n) { int a[21],sum1=0,sum2=0,ans=1<<30; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<(1<<n);i++)//子集枚举 { sum1=0,sum2=0; for (int j=0;j<n;j++) { if (i&(1<<j))//在子集里的到一个大脑,不在的到另一个 sum1+=a[j+1]; else sum2+=a[j+1]; } ans=min(ans,max(sum1,sum2)); } return ans; } int s1,s2,s3,s4,ans; int main() { cin>>s1>>s2>>s3>>s4; cout<<cal(s1)+cal(s2)+cal(s3)+cal(s4); }
-
-4
#include <bits/stdc++.h> using namespace std; int main(){ int s[5],a[21],ans=0,tmp,sum1,sum2; cin>>s[1]>>s[2]>>s[3]>>s[4]; for(int i=1;i<=4;i++){ for(int j=1;j<=s[i];j++)cin>>a[j]; tmp=9999999; for(int j=0;j<(1<<s[i]);j++){ sum1=0,sum2=0; for(int k=0;k<s[i];k++)j&(1<<k)?sum1+=a[k+1]:sum2+=a[k+1]; tmp=min(tmp,max(sum1,sum2)); } ans+=tmp; } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 53
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2160
- 已通过
- 1087
- 上传者