UVa10878(Decode the tape)
这个题他的题目描述较少,一开始看根本不知道它在说什么,->_<-,然后去BAIDU了,
题目要点:用' '(space)来表示数字‘0’,用'o'(小写)表示数字‘1’,然后其他的输入就忽略掉,然后将由‘0’ ‘1’组成的2进 制数转化为对应的acsii码输出。附上代码:
#include <cstdio>
using namespace std;
int main()
{
char buf[20];
int temp = 0;
while(fgets(buf, 20, stdin) != NULL)
{
temp = 0;
if(buf[0] == '_') continue; ///如果是一行下划线,就直接忽略
for(int i = 1; i < 10; ++i)
{
if(buf[i] == 'o')
temp = 2 * temp + 1; ///如果是‘o’,就进位加1
else if(buf[i] == ' ')
temp = 2 * temp; ///如果是‘ ’,就进位
}
putchar(temp); ///将对应ascii码值输出
}
return 0;
}
UVa11292(Dragon of Loowater)
题目分析:看所雇佣的骑士是否能杀掉所有Dragon,如果能的话,就算出雇佣骑士花费的最少钱。
能杀掉Dragon是有条件的
#include <cstdio>
#include <algorithm>
using namespace std;
const int max_size = 20005;
int main()
{
int n,m;
int tag1, tag2;
int spend;
int nn[max_size], mm[max_size];
while(scanf("%d %d", &n, &m) != EOF && (n+m) != 0)
{
tag1 = tag2 = 0;
for(int i = 0; i < n; ++i) ///存储Dragon的信息
scanf("%d", &nn[i]);
for(int i = 0; i < m; ++i) ///存储骑士的信息
scanf("%d", &mm[i]);
sort(nn, nn+n); ///利用sort函数直接对信息进行排序
sort(mm, mm+m);
spend = 0;
for(tag1 = 0; tag1 < n; tag1++)
{
if(tag2 >= m) break; ///tag1是对Dragon的信息进行标记,tag2是对骑士信息进行标记
while(tag2 < m && nn[tag1] > mm[tag2]) tag2++;
///如果满足tag2的值还在骑士数量之内,并且骑士不能杀掉dragon,就让tag2++,直到条件不被满足
if(tag2 >= m) break; ///如果tag2超出m,就break
spend += mm[tag2]; ///能走到这步,就将花费记下来
tag2++;
}
if(tag1 < n) printf("Loowater is doomed!\n"); ///如果if成立,就说明tag2 >= m ,即没有足够的骑士去杀dragon
else printf("%d\n",spend); ///否则输出最小花费
}
return 0;
}
sort()包含在 #include<algorithm>中 复杂度是O(N*lgN)
void sort(RanIt first, RanIt last); //默认的sort函数是按升序排。
RanIt first &RanIt last 分别表示要排数组的头尾 比如arry[100], 就写成sort(arry, arry+100);
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
void sort(RanIt first, RanIt last, Pred pr); // 可以自己写一个函数,按特定意图进行排序。
返回值是bool型
sort详细学习,见STL sort函数简介