水题,只需要将序列分成两部分即可,一部分是大的,一部分是小的。
#include <cstdio>
#include <iostream>
#include <algorithm>
int T,a[105];
int main(int argc,char *argv[]){
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i = 1;i <= 2 * n;i++){
scanf("%d",&a[i]);
}
std::sort(a + 1,a + 2 * n + 1);
for(int i = 1;i <= n;i++){
printf("%d %d ",a[i],a[i + n]);
}
puts("");
}
return 0;
}
对于任意x,如果可以由以上数构成那么都有
x
=
(
11
∗
k
1
+
111
∗
k
2
)
x = (11 * k_1 + 111*k_2)
x=(11∗k1+111∗k2)
x
=
(
11
∗
k
1
+
(
11
∗
10
+
1
)
∗
k
2
)
x = (11 * k_1 + (11 * 10 + 1) * k_2)
x=(11∗k1+(11∗10+1)∗k2)
x
=
11
∗
(
10
∗
k
2
+
k
1
)
+
k
2
x = 11 * (10*k_2 + k_1) + k_2
x=11∗(10∗k2+k1)+k2 所以
x
m
o
d
11
=
k
2
x \mod 11 = k2
xmod11=k2 即
x
m
o
d
11
≤
⌊
x
/
11
/
10
⌋
x \mod 11 \le \lfloor x /11/10 \rfloor
xmod11≤⌊x/11/10⌋
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
long long n;
cin >> n;
if (n % 11 <= n / 11 / 10)
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
对于第i个药剂,如果我们喝了之后状态依旧能大于0,那么我们就喝,如果我们喝了之后小于0,那么我们可以在1 - i 里找一个比i小或相等的替换掉,使喝的瓶数不变,我们可以用堆实现这一操作。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <climits>
#include <utility>
int n;
std::priority_queue<int,std::vector<int>,std::greater<int> >q;
int main(int argc,char *argv[]){
scanf("%d",&n);
long long sum = 0;
while(n--){
int x;
scanf("%d",&x);
q.push(x);
sum += x;
while(sum < 0){
sum -= q.top();
q.pop();
}
}
printf("%d\n",q.size());
return 0;
}