B 1060 爱丁顿数(找规律)

题目

在这里插入图片描述

思路

  1. 从小到大排序,暴力破解会超时。
    此时通过比较每天骑行的公里数,与剩余的天数来判断。
    当第i天骑行的公里数a[i]大于剩余天数n-i时,n-i天即为最大E值。

  2. 通过降序排列,从1开始编号,a【1】为最后一天骑行公里数,此时编号的1为骑行超过该天公里数的天数。
    通过判断a【i】> i 来记录E。(此处代码思路参考柳神

AC代码

  1. 升序排列
#include<bits/stdc++.h>
using namespace std;

int main(){
	int n; cin>>n;
	int a[n]={0},day[n]={0};
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	
	int E =0;
	for(int i=0;i<n;i++)
	  {
	    if(a[i]>n-i)//a[i]是该天骑了公里数,在排序后,n-i就表示后续项数,第一个E为最大的E值 
	    {
	      E=n-i;
	      break;
	    }
	  }
	
	cout<<E;
	
	
}
  1. 降序排列
#include <iostream>
#include <algorithm>
using namespace std;
int a[1000000];
bool cmp1(int a, int b) {
    return a > b;
}
int main() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    sort(a+1, a+n+1, cmp1);
    int ans = 0, p = 1;
    while(ans <= n && a[p] > p) {
        ans++;
        p++;
    }
    printf("%d", ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值