贪心 南阳oj练习

nyoj
喷水装置(一)

时间限制:3000 ms | 内存限制:65535 KB

难度:3

描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0

#include  <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
using namespace std;
int cmp(double a,double b)
{
    return a>b;//按从大到小排列
}
int main()
{
    double a[605];
    int m,n;
    scanf("%d",&m);
    while(m--)
    {
      scanf("%d",&n);
      int i,k=0;
      double l=20.0;//要保证精度,都统一用double型
      for (i=0;i<n;i++)
          scanf("%lf",&a[i]);
      sort(a,a+n,cmp);
      for (i=0;i<n;i++)
      {
          if (a[i]>1&&l>0)//让大于一的直径相加,使得剩余长度能小于0,则结束
          {
               l=l-2*sqrt(a[i]*a[i]-1);
               k++;
          }
          else
          {
              printf("%d\n",k);
              break;
          }
      }
    }
    return 0;
}

寻找最大数

时间限制:1000 ms | 内存限制:65535 KB

难度:2

描述
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888

输入第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)输出每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数样例输入2
92081346718538 10
1008908 5
样例输出9888
98

#include <stdio.h>
#include <string.h>
int main()
{
int m,t;
char n[110];
scanf("%d",&t);
int j;
for (j=0;j<t;j++)
{
int i=0,max=0,k;
scanf("%s",n);//100位数字,用字符的数组存储
scanf("%d",&m);
int l=strlen(n);//计算出位数
for (m;m<l;m++)//只输出l-m个
{
  max=i;//以前一个为标准,从当前出发再往下找
  k=n[i];//并以当前位假设最大
  for(i;i<=m;i++)//找出这一趟中最大的
  {
    if (k<n[i])
    {
     k=n[i];
     max=i;//暂存此时最大的下标
    }
  }
  printf("%d",k-'0');//输出整数
  i=max+1;//找出剩余尽可能大的数
}
printf("\n");
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40823992/article/details/81536918