wgqqq
失敗は終わりではない、諦めるこそが終わりである。ゴールが見えないから人生はおもしろい(失败并非结束,放弃才是完结。正由于看不到终点,人生才有趣。)

本蒟蒻已经掉到灰名了(菜到落泪),希望这次打完能重回绿名吧......

这次赛中A了三题

下面是本蒟蒻的题解

A.Three Piles of Candies

这题没啥好说的,相加除2就完事了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll q;
    scanf("%lld",&q);
    while(q--)
    {
        ll a,b,c;
        scanf("%lld %lld %lld",&a,&b,&c);
        printf("%lld\n",(a+b+c)/2);
    }
    return 0;
 } 

B.Odd Sum Segments

题意大概就是把长度为n的数组分成k段,每段的总和为奇数,若可以则输出YES和和每段的右边界,否则输出NO。

偶数对结果没有影响,所以只用考虑奇数。记录奇数的个数,只要每段中含有奇数个奇数就行。

那么往前面的k-1段中各放一个奇数,再把剩下的奇数放在最后一段,判断最后一段中的奇数个数是否为奇数,判断后打印前面的奇数位置和n即可。(讲的不太清楚...)

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
ll a[maxn];
int main() {
    ll q;
    scanf("%lld",&q);
    while(q--) {
        ll n,k;
        scanf("%lld %lld",&n,&k);
        ll cnt=0;
        for(ll i=1; i<=n; i++) {
            scanf("%lld",&a[i]);
            if(a[i]%2==1)
                cnt++;
        }
        if(cnt>=k&&(cnt-(k-1))%2==1/*判断最后一堆中的奇数个数是否为偶数*/) {
            printf("YES\n");
            ll cnt2=0;
            for(ll i=1; i<=n; i++) {
                if(cnt2>=k-1)break;
                if(a[i]%2==1) {
                    printf("%lld ",i);
                    cnt2++;
                }
                }
                printf("%lld\n",n);
        } else
            printf("NO\n");



    }
    return 0;
}

C.Robot Breakout

大概就是纯模拟吧,对于每个机器人,记录它能到达的x,y的上下界,然后取个交集,输出交集的左边界。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+5;
const ll INF=1e5;
ll a[maxn][4];//储存可达状态 ,a[i][0]为x的下界,a[i][1]为x的上界,a[i][2]为y的下界,a[i][3]为y的上界 
int main()
{
    ll q;
    scanf("%lld",&q);
    while(q--)
    {
        ll n,x,y,f1,f2,f3,f4;
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&f1,&f2,&f3,&f4);
            a[i][0]=a[i][1]=x;//上下界都标记为x 
            a[i][2]=a[i][3]=y;//同理 
            if(f1)a[i][0]=-INF;
            if(f2)a[i][3]=INF;
            if(f3)a[i][1]=INF;
            if(f4)a[i][2]=-INF;
        }
        /*for(int i=1;i<=n;i++)
        {
            cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<" "<<a[i][3]<<endl;
        }*/
        ll xmax=INF,xmin=-INF,ymax=INF,ymin=-INF;
        bool flag =true;
        for(ll i=1;i<=n;i++)
        {
            if(a[i][0]>xmax||a[i][1]<xmin||a[i][2]>ymax||a[i][3]<ymin)
            {
                printf("0\n");
                flag=false;
                break;
            }
            if(xmax>a[i][1])xmax=a[i][1];
            if(xmin<a[i][0])xmin=a[i][0];
            if(ymax>a[i][3])ymax=a[i][3];
            if(ymin<a[i][2])ymin=a[i][2];
        }
        if(flag)
        {
            printf("1 %lld %lld\n",xmin,ymin);
        }
        
        
    }
    return 0;
 } 

后面的题目赛中没做出来(果然还是我太菜了555)

下午补了题晚上再把个人的题解放上来

 

---------------------------------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------------------------------------

 

又颓了一整天5555

晚上补了昨晚cf的D题

发现D1还是很好写的嘛,随便暴力写都能过(毕竟数据小),昨天赛中的时候还把他想成了LCS,还想套模板233333

D2数据大了我的暴力写法直接TLE了,想了半天没办法看了题解。题解的写法是真的优雅。

下面贴出来我的代码(无脑写)和题解的代码(题解的我写了点注释方便理解)。

D1.RGB Substring (easy version)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
int main()
{
    ll q;
    scanf("%lld",&q);
    while(q--)
    {
        ll n,k;
        scanf("%lld %lld",&n,&k);
        string s;
        cin>>s;
        ll mi=maxn;
        for(int i=0;i<=n-k;i++)
        {
            ll cnt1=0,cnt2=0,cnt3=0;
            string b=s.substr(i,k);
            for(int i=0;i<b.length();i++)
            {
                if((i%3==0&&b[i]=='R')||(i%3==1&&b[i]=='G')||(i%3==2&&b[i]=='B'))
                {
                    cnt2++;
                    cnt3++;
                }
                if((i%3==0&&b[i]=='G')||(i%3==1&&b[i]=='B')||(i%3==2&&b[i]=='R'))
                {
                    cnt1++;
                    cnt3++;
                }
                if((i%3==0&&b[i]=='B')||(i%3==1&&b[i]=='R')||(i%3==2&&b[i]=='G'))
                {
                    cnt1++;
                    cnt2++;
                }
                
            }
            if(mi>min(cnt1,min(cnt2,cnt3)))
            {
                mi=min(cnt1,min(cnt2,cnt3));
            }
            
            
        }
        printf("%lld\n",mi);
        
    }
    return 0;
    
 } 

D2.RGB Substring (hard version)

题解真的tql

#include <bits/stdc++.h>

using namespace std;

int main() {
//#ifdef _DEBUG
    //freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
//#endif
    
    const string t = "RGB";

    int q;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        int n, k;
        string s;
        cin >> n >> k >> s;
        int ans = 1e9;
        for (int offset = 0; offset < 3; ++offset) {
            vector<int> res(n);
            int cur = 0;
            for (int j = 0; j < n; ++j) {
                res[j] = (s[j] != t[(j + offset) % 3]);//对应的若不相同 
                cur += res[j];//cur是当前的需要改变的字母数量 
                if (j >= k) cur -= res[j - k];// 若j>=k则把当前的cur减去res[j-k](因为此时这个位置与要计算的位置不在同个字串) 
                if (j >= k - 1) ans = min(ans, cur);/
            }
        }
        cout << ans << endl;
    }
    
    return 0;
}

 

不能颓废啊啊啊啊啊啊啊啊

好好休息好好补知识点!!!

E和F题不打算补了,接下来去学DFS和BFS了,之前稍微了解了一下做了一两道题发现还是不熟练,得多刷点题。

ok那这篇随笔就这样吧。

PS:我永远喜欢远坂凛

 

posted on 2019-07-25 13:17  wgqqq  阅读(300)  评论(0编辑  收藏  举报