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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章