真是的,你们不要起手就开始搞防AK题嘛,搞的身为出题人的我十分的紧张啊QAQ
A Equal_Or_Not_Equal
虽说是个大水题但是并不简单
看到有人起手一个scanf(“%lf”,&a);真是(让我说什么好)
看看数据范围啊亲
1o1000 的数据范围啊亲,怎么想直接double也是不可以的吧
这题的正确做法是字符串处理
要分别处理正负,前导零,后导零(如果有小数点),以及-0.0等于0的情况
trick: 101000 只是数据范围,具体的字符串大小应该在3000左右
B排序算法
看到时间和数据范围就应该知道快排是不可以的
然后注意到数据范围只有a到z(也就是26),那么可以想到直接统计每个字符的个数然后输出
不要memset,否则可能会卡常
(我也不知道为什么标算能过,可能是因为一些神奇的姿势?
还是给出标算好了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000000;
int cnt[30];
char arr[maxn];
void out(int n,char c){
for(int i=0;i<n;i++)
printf("%c",c);
}
int main(){
while(~scanf("%s",arr)){
memset(cnt,0,sizeof(cnt));
for(int i=0;arr[i];i++){
cnt[arr[i]-'a']++;
}
for(int i=0;i<30;i++)
out(cnt[i],'a'+i);
puts("");
}
return 0;
}
如果你还是超时的话,而且是在用C,不妨用C++试试
C路线安排
这个题应该能一眼看出事一个最短路,spfa也(应该)可以过
可以注意到这个图的特殊性,也就是说可以DP
具体的我们可以设DP[0][i]为到Ai的最短时间,DP[1][i]为到Bi的最短时间
那么就有
dp[0][i]=min(dp[0][i-1]+arr[i-1],dp[1][i-1]+brr[i-1]+mid[i-1]);
dp[1][i]=min(dp[1][i-1]+brr[i-1],dp[0][i-1]+arr[i-1]+mid[i-1]);
边界就是dp[0][0]=dp[0][1]=0;
D求三角形面积
感觉这个应该是很好写的
只要你能记得海伦公式
还有平面内的两点间的距离的公式
那么就是一个水题
E高山计数
精心构造数据卡过了n*m的算法
注意到每次改变山的高度的时候只会有四个山收到影响
那么我们就可以维护一下每一个山和前一座山的高度的差值
然后就可以每一次O(1)的计算出变更之后的高山的数量
F工作时间
得到每一天的最大的指标之后
找到指标最小的一天就可以了
G电力工厂
O(n^2)也是不可以的
注意到人的能力值的范围只有100
我们可以O(n)的统计出能力值为i的人数
记a[i]为能力值为i的人数
b[i]为能力值为-i的人数
那么最后的答案就是 ∑100i=1a[i]∗b[i]
H嘿是你的百分号
在约分之后
一个分数可以由有限小数表示的充要条件是分母的质因数只含有2和5
如果是无限小数的话,只要直接printf(“%.0f%%\n”,n*100.0/m);就可以了
这里给出一个方便的计算有限小数的方法,注意到m的范围只有1000
I小豪的百分号
一个简单的打印图形
如果能把答案先输入到一个二维字符数组里面可能可以简化代码量
wait for update