河南第八届省赛(Interference Signal)(简单模拟,有很多注意的)
2015-10-26 09:53
253 查看
题目地址:点击打开链接
题意:给你一个数组有n个数字,求一个最少有m个数字并且连续的子序列的最大平均值乘以1000
思路:本来上来想的是动态规划,怕超时,结果学长说这道题的复杂度比O(n^n)还小,而n<=2000,而测试案例小于8次,1000ms可以进行10^8的运算,所以暴力一下不会超时,学长说这道题的本意应该是用动态规划,结果省赛的老师放宽了限制,暴力也能过
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
int a[2010];
int main()
{
int t;
int n,m,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
double sum;
double max1 = 0;
double ave;
for(i=1; i<=n-m+1; i++)
{
sum = 0;
for(j=i; j<=i+m-1; j++)
{
sum += a[j];
}
ave = sum / m;
k = m;
for(j=i+m; j<=n; j++)
{
sum += a[j];
k++;
double ave1 = sum / k;
if(ave1 > ave)
{
ave = ave1;
}
}
if(ave > max1)
{
max1 = ave;
}
}
int max2 = (int)(max1 * 1000);
printf("%d\n",max2);
//printf("%d\n",(int)max1 * 1000);
}
return 0;
}
错误的原因还是很可笑的,m已经在for循环里了,结果在for循环里又改了m的值,还有一个错误是先把double类型转成int类型,再乘以1000,结果错了,应该是先把double类型乘以1000再转成int类型
错误代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
int a[2010];
int main()
{
int t;
int n,m,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
double sum;
double max1 = 0;
double ave;
for(i=1; i<=n-m+1; i++)
{
sum = 0;
for(j=i; j<=i+m-1; j++)
{
sum += a[j];
}
ave = sum / m;
for(j=i+m; j<=n; j++)
{
sum += a[j];
m++;
double ave1 = sum / m;
if(ave1 > ave)
{
ave = ave1;
}
}
if(ave > max1)
{
max1 = ave;
}
}
printf("%d\n",(int)max1 * 1000);
}
return 0;
}
题意:给你一个数组有n个数字,求一个最少有m个数字并且连续的子序列的最大平均值乘以1000
思路:本来上来想的是动态规划,怕超时,结果学长说这道题的复杂度比O(n^n)还小,而n<=2000,而测试案例小于8次,1000ms可以进行10^8的运算,所以暴力一下不会超时,学长说这道题的本意应该是用动态规划,结果省赛的老师放宽了限制,暴力也能过
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
int a[2010];
int main()
{
int t;
int n,m,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
double sum;
double max1 = 0;
double ave;
for(i=1; i<=n-m+1; i++)
{
sum = 0;
for(j=i; j<=i+m-1; j++)
{
sum += a[j];
}
ave = sum / m;
k = m;
for(j=i+m; j<=n; j++)
{
sum += a[j];
k++;
double ave1 = sum / k;
if(ave1 > ave)
{
ave = ave1;
}
}
if(ave > max1)
{
max1 = ave;
}
}
int max2 = (int)(max1 * 1000);
printf("%d\n",max2);
//printf("%d\n",(int)max1 * 1000);
}
return 0;
}
错误的原因还是很可笑的,m已经在for循环里了,结果在for循环里又改了m的值,还有一个错误是先把double类型转成int类型,再乘以1000,结果错了,应该是先把double类型乘以1000再转成int类型
错误代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
int a[2010];
int main()
{
int t;
int n,m,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
double sum;
double max1 = 0;
double ave;
for(i=1; i<=n-m+1; i++)
{
sum = 0;
for(j=i; j<=i+m-1; j++)
{
sum += a[j];
}
ave = sum / m;
for(j=i+m; j<=n; j++)
{
sum += a[j];
m++;
double ave1 = sum / m;
if(ave1 > ave)
{
ave = ave1;
}
}
if(ave > max1)
{
max1 = ave;
}
}
printf("%d\n",(int)max1 * 1000);
}
return 0;
}
相关文章推荐
- 疯狂Html+CSS+JS 中CSS总结
- css3 media媒体查询器用法总结
- 如何向当前的html文档输入一段字符
- jquery&easyui
- JSP取得绝对路径
- 疯狂Html+CSS+JS 中CSS总结
- 疯狂Html+CSS+JS 中CSS总结
- 疯狂Html+CSS+JS 中CSS总结
- jQuery插件
- 5、Jsp 核心标签库
- JS基于VML技术实现的五角星礼花效果代码
- 按照用户名和角色查询用户liferay
- 2、Jsp 标签 与 freemarker macor 开发比较
- JS遮罩层
- 1.jsp 与 freemarker 比较
- jquery获取url参数及url加参数的方法
- Git中pull对比fetch和merge
- pjsua帮助手册(中文)
- 12 个 CSS 高级技巧汇总
- javascript删除字符串最后一个字符的几种方法