Educational Codeforces Round 75 (Rated for Div. 2)(部分题)

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;
}
发布了20 篇原创文章 · 获赞 12 · 访问量 394

猜你喜欢

转载自blog.csdn.net/weixin_44070289/article/details/102743984