2015年第五届ACM趣味编程循环赛(第三场) 题解

真是的,你们不要起手就开始搞防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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值