题目来源:挑战程序设计竞赛
一。题目链接:点击打开链接
这道排牛的题挺简单的,虽然我的代码算法和书上基本差不多,但是丑······还是贴书上的吧(还是我自己盲敲的)
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
bool left;
int N, b(0), a(0), num(0);
char s[2005] = {0};
cin >> N;
while(N--)
cin >> s[b++];//printf(" S: %s\n", s);
--b;
while( a <= b )
{
left = false;
for(int i = 0; i + a <= b; ++i)
if(s[a + i] < s[b - i]){
left = true;
break;
}
else if(s[a + i] > s[b - i]){
left = false;
break;
}
if(left){
putchar(s[a++]);
}
else{
putchar(s[b--]);
}
if( ++num == 80 ){
putchar('\n');
num = 0;
}
}
return 0;
}
二。题目链接:点击打开链接
莫名觉得这个题目贪心的很好玩。
提前知道是贪心写所以没啥好讲的。
就怕读到题目一脸懵逼的情况。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
int R, n, x[1005];
while( cin >> R >> n && !( R == -1 && n == -1 ))
{
int num(0), k(0);
for(int i = 0; i < n; ++i)
scanf("%d", &x[i]);
sort(x, x + n);
while( k < n )
{
int step(0);
while( k + step < n && x[k + step] <= x[k] + R )
step++;
k += step;
step = 0;
while( k + step < n && x[k + step] <= x[k - 1] + R )
step++;
k += step;
++num;
}
printf("%d\n", num);
}
return 0;
}
三。题目链接:点击打开链接
这道题目的哈夫曼算法在刘汝佳的书里有。
当然我是绝对想不到这两道题竟然是同一个解法。
而且刘汝佳的书里没有代码实现但是有证明。这本书相反,互相补充互相补充。。。
刘汝佳的书里写了个用队列和排列实现的nlogn算法,看懂了,以后有空敲出来再补充。
#include <iostream>
#include <algorithm>
using namespace std;
int solve(int L[], int N)
{
int mi1 = 0, mi2 = 1;
if( L[mi1] > L[mi2] )
swap(mi1, mi2);
for(int i = 2; i < N; ++i)
if( L[i] < L[mi1] ){
mi2 = mi1;
mi1 = i;
}
else if( L[i] < L[mi2] ){
mi2 = i;
}
if( mi1 == N - 1 )
swap( mi1, mi2 );
L[mi1] += L[mi2];
L[mi2] = L[N - 1];
return L[mi1];
}
int main()
{
int N, L[20005] = {0};
long long ans(0);
cin >> N;
for(int i = 0; i < N; ++i)
cin >> L[i];
while( N > 1 )
{
ans = ans + solve(L, N);//cout << ans << '\n';
--N;
}
cout << ans;
return 0;
}
2018.1.18更新
刚学了队列,用队列实现了上道题。我自己先写的,写完了发现和书上一样的!我真厉害。
算法还是哈夫曼。
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> > que;
int N, input;
long long ans(0);
cin >> N;
while( N-- )
{
cin >> input;
que.push(input);
}
while( que.size() > 1 )
{
int temp1 = que.top();
que.pop();
int temp2 = que.top();
que.pop();
ans += (temp1 + temp2);
que.push(temp1 + temp2);
}
cout << ans << endl;
return 0;
}