鱼C论坛

 找回密码
 立即注册
查看: 5366|回复: 26

[已解决]暴力枚举

[复制链接]
发表于 2022-12-18 10:14:32 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 Mike_python小 于 2022-12-18 11:02 编辑

昨天参加了一个竞赛,有一道题永枚举的办法没得到全部分,求助一下不用枚举的做法

  1. 有 N(1≤N≤105)头奶牛可能会入学。每头奶牛最多愿意支付 ci 的学费(1≤ci≤10^6)。 Farmer John 可以设定所有奶牛入学需要支付的学费。如果这笔学费大于一头奶牛愿意支付的最高金额,那么这头奶牛就不会入学。Farmer John 想赚尽可能多的钱,从而可以给他的讲师提供一笔可观的工资。请求出他能赚到的钱的数量,以及此时应当收取多少学费。

  2. 输入格式(从终端 / 标准输入读入):
  3. 输入的第一行包含 N。第二行包含 N 个整数 c1,c2,…,cN,其中 ci 是奶牛 i 愿意支付的最高学费金额。
  4. 输出格式(输出至终端 / 标准输出):
  5. 输出 Farmer John 可以赚到的最大金额以及最优情况下他应该收取的学费。如果有多个解,输出收取学费最小的解。
  6. 注意这个问题涉及到的整数可能需要使用 64 位整数型(例如,Java 中的 "long",C/C++ 中的 "long long")。

  7. 输入样例:
  8. 4
  9. 1 6 4 6
  10. 输出样例:
  11. 12 4
  12. 如果 Farmer John 收费 4,那么 3 头奶牛将会入学,从而使他赚取 3÷4=12 的金额。
复制代码

最佳答案
2022-12-18 10:14:33
打了14个点的蒟蒻申请出战
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int n;
  4. long long c[100001], res = 0, resc = 1ll << 60, rest = 0;

  5. int main() {
  6.         scanf("%d", &n);
  7.         for (int i = 1; i <= n; ++i) {
  8.                 scanf("%d", &c[i]);
  9.         }
  10.         sort(c + 1, c + n + 1); //属于algorithm
  11.         for (int i = 1; i <= n; ++i) {
  12.                 if (c[i] * (n - i + 1) > res) {
  13.                         res = c[i] * (n - i + 1);
  14.                 }
  15.         }
  16.         for (int i = 1; i <= n; ++i) {
  17.                 if (res == c[i] * (n - i + 1)) {
  18.                         resc = min(resc, c[i]); //属于algorithm
  19.                 }
  20.         }
  21.         printf("%lld %lld", res, resc);
  22.        
  23. }
复制代码

最佳答案

查看完整内容

打了14个点的蒟蒻申请出战
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 10:14:33 | 显示全部楼层    本楼为最佳答案   
打了14个点的蒟蒻申请出战
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int n;
  4. long long c[100001], res = 0, resc = 1ll << 60, rest = 0;

  5. int main() {
  6.         scanf("%d", &n);
  7.         for (int i = 1; i <= n; ++i) {
  8.                 scanf("%d", &c[i]);
  9.         }
  10.         sort(c + 1, c + n + 1); //属于algorithm
  11.         for (int i = 1; i <= n; ++i) {
  12.                 if (c[i] * (n - i + 1) > res) {
  13.                         res = c[i] * (n - i + 1);
  14.                 }
  15.         }
  16.         for (int i = 1; i <= n; ++i) {
  17.                 if (res == c[i] * (n - i + 1)) {
  18.                         resc = min(resc, c[i]); //属于algorithm
  19.                 }
  20.         }
  21.         printf("%lld %lld", res, resc);
  22.        
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 10:54:26 | 显示全部楼层
  1. #include <iostream>

  2. using namespace std;

  3. int n;
  4. long long c[10001];
  5. long long xue_fei=0;
  6. long long shou_fei=0;
  7. long long a=0, temp=0, jishu=0;

  8. int panduan() {
  9.     for(int i=0;i<n;i++) {
  10.         a=0;
  11.         temp=0;
  12.         for(int j=0;j<n;j++) {
  13.             if(c[j]>=c[i]) {
  14.                 a+=c[i];
  15.                 temp++;
  16.             }
  17.         }
  18.         if (a>xue_fei) {
  19.             xue_fei=a;
  20.             shou_fei=c[i];
  21.             jishu=temp;

  22.         }
  23.         else if(a==xue_fei) {
  24.             if(temp>=jishu) {
  25.                 xue_fei=a;
  26.                 shou_fei=c[i];
  27.                 jishu=temp;
  28. //                cout << "i:" << i << ",a:" << a << ",temp:" << temp << endl;

  29.             }
  30.         }


  31.     }
  32.     cout << xue_fei << " " << shou_fei;
  33. }

  34. int main() {
  35.      cin >> n;
  36.      for (int i=0;i<n;i++) {
  37.          cin >> c[i];
  38.      }
  39.     panduan();

  40. }
复制代码




这是我的狗屎代码,他错误了几个,超出运行内存或时间了几个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 10:55:10 | 显示全部楼层
  1. #include <stdio.h>
  2. #define MAXN 110
  3. #define ll long long

  4. int cows[MAXN];
  5. int main()
  6. {
  7.         int n; scanf("%d", &n);
  8.         for(int i=0; i<n; ++i) {
  9.                 int temp; scanf("%d", &temp);
  10.                 cows[temp]++;
  11.         }
  12.        
  13.         ll max_ = -1;
  14.         int lower = 0;
  15.         int max_money;
  16.         for(int i=0; i<MAXN; ++i) {
  17.                 if(!cows[i]) continue;
  18.                 if(!(n-lower)) break;
  19.                 ll t = ((ll) (n-lower) * i);
  20.                 if(t > max_){
  21.                         max_ = t;
  22.                         max_money = i;
  23.                 }
  24.                 lower += cows[i];
  25.         }
  26.         printf("%d %d", max_, max_money);
  27.         return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 10:59:08 | 显示全部楼层

测试点1是正确的(输入样例:
4
1 6 4 6
输出样例:
12 4)

之后的2-4是错误的,5-12是超出运行时错误或内存限制
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:00:19 | 显示全部楼层

测试点 2-4 满足 ci≤1,000。
测试点 5-8 满足 N≤5,000。
测试点 9-12 没有额外限制。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 11:03:04 | 显示全部楼层
Mike_python小 发表于 2022-12-18 11:00
测试点 2-4 满足 ci≤1,000。
测试点 5-8 满足 N≤5,000。
测试点 9-12 没有额外限制。

这个呢
  1. #include <stdio.h>
  2. #define MAXN 10010
  3. #define ll long long

  4. int cows[MAXN];
  5. int main()
  6. {
  7.         ll n; scanf("%lld", &n);
  8.         for(int i=0; i<n; ++i) {
  9.                 ll temp; scanf("%lld", &temp);
  10.                 cows[temp]++;
  11.         }
  12.        
  13.         ll max_ = -1;
  14.         ll lower = 0;
  15.         ll max_money;
  16.         for(ll i=0; i<MAXN; ++i) {
  17.                 if(!cows[i]) continue;
  18.                 if(!(n-lower)) break;
  19.                 ll t = ((ll) (n-lower) * i);
  20.                 if(t > max_){
  21.                         max_ = t;
  22.                         max_money = i;
  23.                 }
  24.                 lower += cows[i];
  25.         }
  26.         printf("%lld %lld", max_, max_money);
  27.         return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:05:13 | 显示全部楼层

情况好一点,1-4的数据正确,5-12的数据超出运行时错误或内存限制(并非时间限制)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 11:08:36 | 显示全部楼层
Mike_python小 发表于 2022-12-18 11:05
情况好一点,1-4的数据正确,5-12的数据超出运行时错误或内存限制(并非时间限制)

这个呢
  1. #include <stdio.h>
  2. #define MAXN 10010
  3. #define ll long long

  4. ll cows[MAXN];
  5. int main()
  6. {
  7.         ll n; scanf("%lld", &n);
  8.         for(int i=0; i<n; ++i) {
  9.                 ll temp; scanf("%lld", &temp);
  10.                 cows[temp]++;
  11.         }
  12.        
  13.         ll max_ = -1;
  14.         ll lower = 0;
  15.         ll max_money;
  16.         for(ll i=0; i<MAXN; ++i) {
  17.                 if(!cows[i]) continue;
  18.                 if(!(n-lower)) break;
  19.                 ll t = ((ll) (n-lower) * i);
  20.                 if(t > max_){
  21.                         max_ = t;
  22.                         max_money = i;
  23.                 }
  24.                 lower += cows[i];
  25.         }
  26.         printf("%lld %lld", max_, max_money);
  27.         return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:10:34 | 显示全部楼层

和上一次一样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 11:20:10 | 显示全部楼层

那这个呢
  1. #include <stdio.h>
  2. #define MAXN 100010
  3. #define ll long long

  4. ll cows[MAXN];
  5. int main()
  6. {
  7.         ll n; scanf("%lld", &n);
  8.         for(int i=0; i<n; ++i) {
  9.                 ll temp; scanf("%lld", &temp);
  10.                 cows[temp]++;
  11.         }
  12.        
  13.         ll max_ = -1;
  14.         ll lower = 0;
  15.         ll max_money;
  16.         for(ll i=0; i<MAXN; ++i) {
  17.                 if(!cows[i]) continue;
  18.                 if(!(n-lower)) break;
  19.                 ll t = ((ll) (n-lower) * i);
  20.                 if(t > max_){
  21.                         max_ = t;
  22.                         max_money = i;
  23.                 }
  24.                 lower += cows[i];
  25.         }
  26.         printf("%lld %lld", max_, max_money);
  27.         return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:21:20 | 显示全部楼层

还是一样的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 11:27:03 | 显示全部楼层

  1. int cmp(void* a,void *b)
  2. {
  3.     return *(int*)b-*(int*)a;
  4. }
  5. int main()
  6. {
  7.     int N,max,i;
  8.     scanf("%d",&N);
  9.     int ci[N];
  10.     for(int i=0;i<N;i+=1)scanf("%d",&ci[i]);
  11.     qsort(ci,N,sizeof(int),cmp);
  12.     for(i=0,max=ci[0];i<N&&max<=(i+1)*ci[i];i+=1)
  13.     {
  14.         if(max<(i+1)*ci[i])max=(i+1)*ci[i];
  15.         printf("%d ",ci[i]);
  16.     }
  17.     printf("\n%d %d",i*ci[i-1],ci[i-1]);
  18.     return 0;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:31:13 | 显示全部楼层

我是小白,请问qsort用什么头文件?我用#include <stdlib.h>他显示No matching function for call to 'qsort'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 11:36:22 | 显示全部楼层
  1. main.cpp: In function ‘int main()’:
  2. main.cpp:18:31: error: invalid conversion from ‘int (*)(void*, void*)’ to ‘__compar_fn_t {aka int (*)(const void*, const void*)}’ [-fpermissive]
  3.      qsort(ci,N,sizeof(int),cmp);
  4.                                ^
  5. In file included from /usr/include/c++/7/cstdlib:75:0,
  6.                  from /usr/include/c++/7/ext/string_conversions.h:41,
  7.                  from /usr/include/c++/7/bits/basic_string.h:6361,
  8.                  from /usr/include/c++/7/string:52,
  9.                  from /usr/include/c++/7/bits/locale_classes.h:40,
  10.                  from /usr/include/c++/7/bits/ios_base.h:41,
  11.                  from /usr/include/c++/7/ios:42,
  12.                  from /usr/include/c++/7/ostream:38,
  13.                  from /usr/include/c++/7/iostream:39,
  14.                  from main.cpp:1:
  15. /usr/include/stdlib.h:827:13: note:   initializing argument 4 of ‘void qsort(void*, size_t, size_t, __compar_fn_t)’
  16. extern void qsort (void *__base, size_t __nmemb, size_t __size,
  17.              ^~~~~
  18. main.cpp:15:10: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  19.      scanf("%d",&N);
  20.      ~~~~~^~~~~~~~~
  21. main.cpp:17:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  22.      for(int i=0;i<N;i+=1)scanf("%d",&ci[i]);
  23.                           ~~~~~^~~~~~~~~~~~~
复制代码


报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 11:58:20 | 显示全部楼层
  1. #include <iostream>

  2. using namespace std;

  3. int n;
  4. long long c[1000001];
  5. long long xue_fei=0;
  6. long long shou_fei=0;
  7. long long a=0, temp=0, jishu=0;

  8. int panduan()
  9. {
  10.     temp=a*c[a];
  11.     int i;
  12.     for(i=a,a=c[a]; i>0; i-=1,a+=c[i])
  13.     {
  14.         if(c[i])
  15.         {

  16.             if(temp>a*i)break;
  17.             xue_fei=i;
  18.         }

  19.     }
  20.     printf("%lld %lld",temp,xue_fei);
  21. }

  22. int main()
  23. {
  24.     cin >> n;
  25.     for (int i=0; i<n; i++)
  26.     {
  27.         cin >> temp;
  28.         if(temp>a)a=temp;
  29.         c[temp]+=1;
  30.     }
  31.     panduan();

  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 12:01:22 | 显示全部楼层

只有测试点1是正确的,其余是错误的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 12:25:51 | 显示全部楼层
本帖最后由 jhq999 于 2022-12-18 12:30 编辑


  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int cmp(const void* a,const void *b)
  4. {
  5.     return *(int*)b-*(int*)a;
  6. }
  7. int main()
  8. {
  9.     int N,max,i;
  10.     scanf("%d",&N);
  11.     int ci[N];
  12.     for(int i=0;i<N;i+=1)scanf("%d",&ci[i]);
  13.     qsort(&ci,N,sizeof(int),cmp);
  14.     for(i=0,max=ci[0];i<N&&max<=(i+1)*ci[i];i+=1)
  15.     {
  16.         if(max<(i+1)*ci[i])max=(i+1)*ci[i];
  17.         printf("%d ",ci[i]);
  18.     }
  19.     printf("\n%d %d",i*ci[i-1],ci[i-1]);
  20.     return 0;
  21. }
复制代码
无标题.png
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-18 12:31:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-18 12:34:33 | 显示全部楼层
本帖最后由 jhq999 于 2022-12-18 12:43 编辑


等一会,转移一下
  1. #include <iostream>
  2. using namespace std;
  3. int ci[106];
  4. int cmp(const void* a,const void *b)
  5. {
  6.     return *(int*)b-*(int*)a;
  7. }
  8. int main()
  9. {
  10.     int N,max,i;
  11.     cin>>N;
  12.     for(i=0;i<N;i+=1)cin>>ci[i];
  13.     qsort(&ci,N,sizeof(int),cmp);
  14.     for(i=0,max=ci[0];i<N&&max<=(i+1)*ci[i];i+=1)
  15.     {
  16.         if(max<(i+1)*ci[i])max=(i+1)*ci[i];
  17.     }
  18.     cout<<i*ci[i-1]<<" "<<ci[i-1]<<endl;
  19.     return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表