我的ACM之旅

来源:互联网 发布:java客服系统源码 编辑:程序博客网 时间:2024/04/28 13:49
作为新一代菜鸟级别的人,做题选简单的做,代码往低级的写,什么算法啊,解题思路啊,都没有。不得不说差到一定程度了,处于这种状况那只有一个原因———自己看书做题太少,对于我而言,一个才c语言基础还没打牢的人,这可怎么的了啊,然而这种抱怨并没有什么卵用。努力才是王道。好了不扯那么多了。先来看看我几个用低级代码做的比赛题。

参加暑假集训的第二天就开始了三天的比赛,先看看第一天的题:

A士兵买香蕉(CodeForces 546A)

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82659#problem/A
说实话,题目不难,难的是这个题目英语题目,对于英语水平之过了二级的人来说,不管题目难不难,看见是英语的题目就难;看完题目,理解意思后,大神们已经写第二题了,但是毕竟自己写出来了,也感觉有点成就感,估计出题者是想给水平差的人找个台阶下。
解题思路:题目意思是买第一次香蕉花 k dollars,第二次买花 2k dollars,第三次买花 3k dollars,那么我们可以直接累加来计算最后总共花了多少钱,最后来个判断,判断士兵自己的钱够不够,够了就好,可以自己买,不够的话你只能借钱买咯,最后算一个差价。

include<iostream>include <cmath>using namespace std;int main(){  int k,n;  long w,t=0;  cin>>k;  cin>>n;  cin>>w;  for(int i=1;i<=w;i++)     t+=i*k;  if(t>n)    cout<<t-n<<endl;  else      cout<<"0"<<endl;return 0;}

B排序问题(UVA 11462)

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82659#problem/B
这个题本来想直接用sort函数排序,但是肯定没这么简单的,假如用函数直接排序,这题超时了,对于ACM的很多题,在我看来很多简单的题,我都超时了,所以时间是个很重要的东西。但是这道题目最终超时,我没做出来,但是比赛完后一看别人的代码才明白过来。
解题思路:先创建一个全为0的数组,再将输入的数存为数组下标,使该地址的值为1,例如,输入1 ,3, 5三个数,那么c[1]=c[3]=c[5]=1,而其他元素的值为0,通过判断值是否为1,输出排列好的结果,这种思路让我长知识了。

include <cstdio>include <iostream>using namespace std;int main(){    int n;    while(scanf("%d",&n) && n){        int c[101] = {0};        int x;        for(int i = 0; i < n; i++){            scanf("%d",&x);            c[x]++;//使元素的值为1,        }        int flag = 1;        for(int i = 0; i < 100; i++)    {              if(c[i])        for(int j = 0; j < c[i]; j++)            {                if(!flag)                 printf(" ");                flag = 0;                printf("%d",i);            }        }        printf("\n");    }    return 0;}

C去除相同数

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82659#problem/C
这道题就差几步就可以完成了,但是死在思路上了,思路太混乱,就是在if判断语句的时候想错了(看注析),
解题思路:先将输入的数据存在一个数组,在用sort函数进行排序,找出相同的数,对其中一个相同的数进行加1,直到不存在相同的两个数。解题关键是思路清晰。

include <cstdio>include<algorithm>include <iostream>include <vector>using namespace std;int main(){    int n,m,count=0;    scanf("%d",&n);    vector<int>a(n);    for(int i=0;i<n;i++)        scanf("%d",&a[i]);    m=n;    while(n--){        sort(a.begin(),a.end());            for(int i=0;i<m-1;i++)         if(a[i]==a[i+1])         {           a[i]=a[i]+1; //原来写的是a[i+1]=a[i+1]+1;          // 我认为将后面那位数加1,再通过重新排列,         // 但是正是因为我是这样想提交没通过,             count++;         }    }    cout<<count<<endl;    return 0;}

D分巧克力

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82659#problem/D
这个题目最简单只要你大概的看懂英语。你看代码就知道这个题目有多简单。
解题思路:我做这个题目的思路就是投机取巧,看了下案例,发现了规律,

#include<iostream>#include <cmath>using namespace std;int main (){   int m ,n,t=0;   while(cin>>m>>n)   {         t=m*n-1;     cout<<t<<endl;   }return 0;}

先写这么多吧!如果有不对的地方,请不吝赐教,QQ:932552783

0 0
原创粉丝点击