A Broken Keyboard
我因为一个小问题看了半天,不愧是我,bug制造者QAQ
用vis数值记录可用的键盘,从前向后遍历,相等加2,不想等记录+1;
B Binary Palindromes
这题好像有一个串且不是回文串的情况没有特判,但也过了。题意是各种串之间可随意交换相同个数片段无限次,只要考虑1的个数是奇数且没有奇数长度字符的为错,其他都是正确的。憨憨错了一次!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string s[60];
int main()
{
int T, n;
cin >> T;
while(T--) {
int a = 0, b = 0;
cin >> n;
bool c = 0;
for(int i = 0; i < n; i++)
{
cin >> s[i];
int l = s[i].length();
for(int j = 0; j < l; j++)
if(s[i][j] == '0') b++; else a++;
if(l%2==0);
else c = 1;
}
if(a%2==1&&!c) printf("%d\n", n-1);
else printf("%d\n", n);
}
return 0;
}
C Minimize The Integer
思维题
题意:一个数字串,相邻且奇偶性相同之间的数可相互交换,求最小整数。也就是说奇数的相对位置不变 ,偶数也是如此,放进组,比较,谁小谁放前面。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5+10;
char s[N];
vector<int> a;
vector<int> b;
int main()
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%s", s);
int len = strlen(s);
a.clear(); b.clear();
for(int i = 0; i < len; ++i)
{
int temp = s[i]-'0';
if(temp%2 == 0) a.push_back(temp);
else b.push_back(temp);
}
int i = 0, j = 0;
int lena = a.size(), lenb = b.size();
while(1)
{
if(i >= lena&&j >= lenb) break; //如果两个都到末端,结束
if(i >= lena) //一个到末端,另一个直接输出全部,下面相同
{
for(; j < lenb; ++j)
printf("%d", b[j]);
break;
}
if(j >= lenb)
{
for(; i < lena; ++i)
printf("%d", a[i]);
break;
}
if(a[i] < b[j]) //奇数偶数谁小谁先放
{
printf("%d", a[i++]);
}
else
printf("%d", b[j++]);
}
printf("\n");
}
return 0;
}
D Salary Changing
这题我最开始排完序想到了二分,可是没思路,就想用贪心,然后就连wa
二分答案,我发现判断函数和我写的贪心差不多,就是先把所有值都设为左值,再看能否有足够的大于中值的数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#define debug(x, y) cout <<x<<" "<<y<<endl
#define nl cout <<endl
#define fr(x, y) for(int i = x; i <= y; ++i)
const int N = 1e5+10, maxn = 2e5+10;
int n, m;
ll s;
struct node
{
int l, r;
bool operator<(const node &x) const {
if(l!=x.l)
return l < x.l;
else return r < x.r;
}
}a[maxn];
bool ok(int x)
{
ll sum = 0;
for(int i = 0; i < n; ++i) sum += a[i].l;
int c = 0;
for(int i = n-1; i >= 0&& c < m; --i) { //这里注意是从后向前
if(a[i].r >= x) {
sum += max(x-a[i].l, 0);
c++;
}
}
return c == m&&sum <= s;
}
int erfen()
{
int l = 0, r = 1e9+7;
int mi = 0;
while(l <= r)
{
int mid = (l+r)/2;
if(ok(mid))
{
mi = max(mi, mid);
l = mid+1;
}
else r = mid-1;
}
return mi;
}
int main ()
{
//freopen("F:\in.text", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%I64d", &n, &s);
m = (n+1)/2;
for(int i = 0;i < n; ++i) scanf("%d%d", &a[i].l, &a[i].r);
sort(a, a+n);
// for(int i = 0; i < n; ++i) debug(a[i].l, a[i].r);
printf("%d\n", erfen());
}
return 0;
}