Codeforces Round #617 (Div. 3)(A~E2)

真个人生都是灰色了,大早上的让hack一道题…

A. Array with Odd Sum

水题,直接看代码吧。

#include<iostream>

using namespace std;
const int N = 2500;
int a[N];
int t,n;

int main()
{
	cin>>t;
	while(t--)
    {
		cin>>n;
		int num=0;
		for(int i=1;i<=n;i++)
        {
			cin>>a[i];
			if(a[i]&1)
				num++;
		}
		if(num&1) 
            puts("YES");
		else 
		{
			if(num==0||num==n) 
                puts("NO");
			else 
                puts("YES");
		}
	}
	
	return 0;
}

B. Food Buying

水题,直接看代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10000;
int main()
{
    int T;  cin>>T;
    while(T--)
    {
        ll n;  cin>>n;
        ll sum=0;
        while(n>=10)
        {
            int a=n/10;
            sum=sum+a*10;
            n=n%10+a;

        }
        cout<<sum+n<<endl;
    }
	return 0;
}

C. Yet Another Walking Robot

题意:寻找环,而且这个环的R-L+1最小。
思路:暴力map+pair即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1010;
typedef pair<int,int> pii;

int main()
{

    int t;
	cin>>t;
	string s;
    while(t--)
    {
        ll n;
		cin>>n>>s;
		map<pii,int> mp;
        int l=0,r=n+10;
        pii p={0,0};
        for(int i=0;i<n;i++)
        {
        	if(s[i]=='L') p.first--;
        	else if(s[i]=='R') p.first++;
        	else if (s[i]=='U') p.second++;
        	else p.second--;
			if(((mp[p]!=0||(p.first==0&&p.second==0))&&(i-mp[p])<(r-l)))
        	{
        		l=mp[p];
        		r=i+1;
			}
			mp[p]=i+1;
		}
		if(r-l<=n) cout<<l+1<<' '<<r<<endl;
		else cout<<-1<<endl;
    }
	return 0;
}

D. Fight with Monsters

题意:给n个怪兽,你和你的小伙伴攻击力分别是a,b,你有k次机会让你的小伙伴跳过该轮拔枪,你如果是最后一击就你杀人数+1,否则就不加1,问你最多杀多少人.
思路:贪心问题,给自己留最后一滴血。(有没有感觉和博弈论很像,给对手留最后一下…)
直接看代码吧,还是比较简单的.

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int s[N];
int main()
{
	int n,a,b,k;
	cin>>n>>a>>b>>k;
	for(int i=0;i<n;i++)
	{
        cin>>s[i];
		s[i]=((s[i]-1)%(a+b))/a;
	}
	sort(s,s+n);
	int i;
	for(i=0;i<n;i++)
	{
		k=k-s[i];
		if(k<0)
            break;

	}
	cout<<i<<endl;
	return 0;
}

E1. String Coloring (easy version)

题意:
给出一个字符串,现在给每个位置进行染色,至多用两种颜色。
然后可以执行任意次操作:交换两个相邻的且颜色不相同的字符。
问执行任意次操作后,得到的字符串是否能有序,如果能,给出一种染色方案。
思路:直接看大佬博客吧!真的是太厉害了。附:大佬博客

#include<bits/stdc++.h>
using namespace std;
void solve()
{
    int n,i;
    string s,ans="";
    cin>>n>>s;
    char mx='a',pmx='a';
    for(i=0;i<n;i++)
    {
        if(s[i]>=mx)
        {
            mx=max(mx,s[i]);
            ans+="0";
        }
        else
        {
            if(pmx<=s[i])
            {
                ans+="1";
                pmx=max(pmx,s[i]);
            }
            else
            {
                cout<<"NO\n";
                return;
            }
        }
    }
    cout<<"YES\n"<<ans;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    
    return 0;
}

E2. String Coloring (hard version)

题意:同E1一样,不过求的是最少用几种颜色可以把这条串换成有序的.
思路:根据E1里面大佬的博客思路三,自己修改一下得出下面的代码,其实思路也很简单,就是求有几条非严格递增的序列.

#include<bits/stdc++.h>
using namespace std;
void solve()
{
    int n,i,done=0,cur=0;
    char mx;
    string s;
    cin>>n>>s;
    vector<int> ans(n,0);
    while(done<n)
    {
        mx='a';
        cur++;
        for(i=0;i<n;i++)
        {
            if(!ans[i]&&s[i]>=mx)
            {
                mx=s[i];
                done++;
                ans[i]=cur;
            }
        }
    }
    cout<<cur<<'\n'<<ans[0];
    for(i=1;i<n;i++)
        cout<<' '<<ans[i];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    
    return 0;
}

F题懒得补了,还是留点时间学DP。

发布了41 篇原创文章 · 获赞 5 · 访问量 2252

猜你喜欢

转载自blog.csdn.net/mumuhaoshuai/article/details/104181495