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;
}