Codeforces Round #630 (Div. 2)

题目链接:https://codeforces.com/contest/1332

A. Exercising Walk

反复移动使两个方向步数抵消,然后看步数较多方向的长度是否大于等于余下步数。

#include <bits/stdc++.h>
using namespace std;

void solve()
{
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int x,y,x1,x2,y1,y2;
    cin>>x>>y>>x1>>y1>>x2>>y2;
    
    int l1=max(x-x1,x2-x),l2=max(y2-y,y-y1);
    if(l1>0){//如果可以向左或向右走
        int mi=min(a,b);//左右移动相互抵消
        a-=mi,b-=mi;
        if(a>0&&a<=x-x1) a=0;
        if(b>0&&b<=x2-x) b=0;
    }

    if(l2>0){
        int mi=min(c,d);
        c-=mi,d-=mi;
        if(c>0&&c<=y-y1) c=0;
        if(d>0&&d<=y2-y) d=0;
    }

    if(a||b||c||d) cout<<"No\n";
    else cout<<"Yes\n";
}

int main()
{
    int t;cin>>t;
    while(t--)
        solve();
    return 0;
}
View Code

B. Composite Coloring

平方小于1000的只有11个质因数,最小质因数相同的染一个颜色即可。

#include <bits/stdc++.h>
using namespace std;

void solve()
{
    int n;cin>>n;
    int res[n]={};

    int color=0;
    map<int,int> m;
    
    for(int i=0;i<n;i++){
        int t;cin>>t;
        for(int j=2;j<=t;j++){
            if(t%j==0){
                if(m[j]) res[i]=m[j];//如果该质因数之前已出现,该数染相同颜色即可
                else res[i]=m[j]=++color;//否则给该质因数分配一个新颜色
                break;
            }
        }
    }

    cout<<color<<"\n";
    for(int i=0;i<n;i++) cout<<i<<" \n"[i==n-1];
}

int main()
{
    int t;cin>>t;
    while(t--)
        solve();
    return 0;
}
View Code

C. K-Complete Word

每次取两端字符和两端向内的周期字符,这些都是要一样的,换成里面最多的那个就可以了。

#include <bits/stdc++.h>
using namespace std;
 
void solve()
{
    int n,k;cin>>n>>k;
    string s;cin>>s;

    int ans=0;
    bool vis[n]={};

    for(int i=0;i<n;i++)
    {
        if(vis[i]) continue;
        vector<char> v;

        for(int j=i;j<n;j+=k)
            if(!vis[j]){
                v.push_back(s[j]);
                vis[j]=true;
            }
        for(int j=n-i-1;j>=0;j-=k)
            if(!vis[j]){
                v.push_back(s[j]);
                vis[j]=true;
            }
            
        int cnt[26]={};
        for(char c:v) cnt[c-'a']++;
        int mx=*max_element(cnt,cnt+26);
        ans+=int(v.size())-mx;
    }

    cout<<ans<<"\n";
}
 
int main()
{
    int t;cin>>t;
    while(t--)
        solve();
    return 0;
}
View Code

D. Walk on Matrix

原来的dp代码会因为追求当前的最大与值而舍弃掉会使答案更大的较小值,按照相同思路构造即可。

#include <bits/stdc++.h>
using namespace std;
const int inf=1<<17;
int main()
{
    int k;cin>>k;
    cout<<"2 3\n";
    cout<<(inf+k)<<' '<<k<<' '<<inf<<"\n";
    cout<<inf<<' '<<(inf+k)<<' '<<k;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Kanoon/p/12609890.html