题目1:
P1716 双调序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这是我第一次一次提交就满分的题目,很开心。
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000];
int n, m;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
if (n%2 == 0)
{
for (int l = 1, r = n; l <= n / 2; l++)
{
cout << a[r] << endl;
cout << a[l] << endl;
r--;
}
}
else
for (int l = 1, r = n; l <= n / 2+1; l++)
{
if (l != r)
{
cout << a[r] << endl;
cout << a[l] << endl;
r--;
}
else
cout << a[l] << endl;
}
return 0;
}
还有解法是利用deque或者queue
不过代码有点问题,只有偶数答案才对
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int n;
int a[1000];
deque<int>p;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++)
{
p.push_front(a[i]);
}
while (!p.empty())
{
cout << p.front() << endl;
p.pop_front();
cout << p.back() << endl;
p.pop_back();
}
return 0;
}
还有就是queue
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
priority_queue<ll, vector<ll>, greater<ll> > q1;//最小值队列
priority_queue<ll, vector<ll>, less<ll> > q2;//最大值队列
ll n;
int main() {
register int i;
scanf_s("%lld", &n);
for (i = 1; i <= n; i++) {
ll k;
scanf_s("%lld", &k);
q1.push(k);
q2.push(k);//放入队列
}
while (n) {//输出n个
if (n)cout << q2.top() << endl, q2.pop(), n--;//弹出最大值
if (n)cout << q1.top() << endl, q1.pop(), n--; //弹出最小值
}
return 0;
}
题目2:
P1207 [USACO1.2]双重回文数 Dual Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
int n, s;
int a[1000];
int search(int x, int k)
{
int p = 0;//如果这个条件你放外面了,那就永远过不去
while (x)
{
a[p++] = x % k;
x = x / k;//顺序并没有什么影响,正反判断是不是回文都是可以的
}
int i = 0;
int j = p - 1;
while (i < j)
if (a[i++] != a[j--])
return 0;
return 1;
}
int main()
{
cin >> n >> s;
int ans = 0;
for (int i = s + 1; ans != n; i++)
{
int cnt = 0;
for (int j = 2; j <= 10 && cnt < 2; j++)
{
if (search(i, j))
cnt++;//根据题目要求至少要有两钟进制都是回文数
}
if (cnt >= 2)
{
cout << i << endl;
ans++;//这个才是用来计数的
}
}
return 0;
}
下面这个解释的更加详细
#include<bits/stdc++.h>
using namespace std;
bool ispal(int n,int k){
short res[100]={0},p=0;//res里装的是转换后的k进制数
while(n){
res[p++]=n%k;
n/=k;
}//10转2进制怎么转,10转k进制就怎么转——模拟短除法。当然这么搞到的k进制数在数组里是个反的。
//即使数字反了,因为只用判断是不是回文,所以可以不用管。
//再者,如果是回文,那反不反转好像没啥区别....
int i=0,j=p-1;
while(i<j)
if(res[i++]!=res[j--])return 0; //判断是不是回文
return 1;
}
int main(){
int n,s;
cin>>n>>s;
int ans=0;
for(int i=s+1;ans!=n;i++){
int cnt=0;
for(int j=2;j<=10&&cnt<2;j++){
if(ispal(i,j))cnt++;//在j进制下i为回文数,计数cnt++
}
if(cnt>=2)printf("%d\n",i),ans++;//若计数不小于2,则输出,答案计数ans++
}
return 0;
}