Codeforces Round #617 (Div. 3)

A - Array with Odd Sum

题意就是一个数组,你可以把数组中任意一个数变成数组中的另外一个数,让你进行这样的操作,求最后能否使这个数组的和为奇数;

思路:
只要这个数组中存在一个奇数就行了,特判如果数组中全是奇数的情况下,数组的长度是否是偶数;

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		int cnt=0;
		for(int i=0;i<n;i++)
		{
			int x;
			cin>>x;
			if(x%2==1) cnt++;
			
		}
		if(cnt==n&&n%2==0)
		{
			cout <<"NO"<<endl;
			continue;
		}
		if(cnt>0) cout <<"YES"<<endl;
		else cout <<"NO"<<endl;
	}
}

.

B - Food Buying

注意round down是向下取整;
然后贪心策略为每次都用最高位代表的整数去买东西;比如12345,先买10000,返回10000/10=1000;现在手里一共有1000+2345=3345,然后再买3000,返回300…如此进行下去即可;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int get_h(int x)
{
	int cnt=0;
	while(1)
	{
		if(x/10==0) break;
		x/=10;
		cnt++;
	}
	return x*pow(10,cnt);
}
int main()
{
	int t;
	cin >>t;
	
	while(t--)
	{
		ll sum=0;
		int s;
		cin >>s;
		while(s>0)
		{
			ll res=get_h(s);
			sum+=res;
			s=s-res+res/10;
			
		}
		cout <<sum<<endl;
		
	}
}

.

C. Yet Another Walking Robot

map+pair 只要这个点重复出现了那么就保存起来上一次到这一次出现的位置,以及长度;

#include <bits/stdc++.h>
using namespace std;
map<pair<int,int>, int> mp;
struct node
{
	int l,r;
	int cnt;
}bb[1000010];
bool cmp(node a,node b)
{
	if(a.cnt==b.cnt) return a.l<b.l;
	return a.cnt<b.cnt;
}
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		mp.clear();
		int n;
		cin >>n;
		string s;
		cin >>s;
		int x=0,y=0;
		mp[make_pair(x,y)]=0;
		int cot=0,flag=0;
		for(int i=0;i<n;i++)
		{
			if(s[i]=='L') y--;
			if(s[i]=='R') y++;
			if(s[i]=='U') x--;
			if(s[i]=='D') x++;
			if(mp[make_pair(x,y)]||(x==0&&y==0))
			{
				bb[cot].l=mp[make_pair(x,y)]+1;
				bb[cot].r=i+1;
				bb[cot++].cnt=i-mp[make_pair(x,y)]+1;
				flag=1;
			}
			mp[make_pair(x,y)]=i+1; 
		}
		sort(bb,bb+cot,cmp);
		if(flag)
			cout <<bb[0].l<<" "<<bb[0].r<<endl;
		else cout <<-1<<endl;
	}
}

.

D. Fight with Monst

对于每一个怪物的血量都进行贪心,如果我要先把这个怪物杀死,到我打的时候我必须把他杀死,到对手打的时候如果对手能把他杀死,就使用技能不让他打,然后我打,一直把他打死;这样就出现以下几种情况:

  1. 怪物血量mod上(a+b)之后小于a,也就是n个回合之后还是我先手,此时我能把怪物打死;
  2. 怪物血量mod上(a+b)之后大于a,然后我再输出a的伤害i,此时怪物剩下y的血量,这些血量需要我使用技能的次数为 [ y/a ]代表向上取整;
  3. 怪物血量mod上(a+b)之后等于0,也就是n个完整的回合之后对手把怪物打死,如果我想把怪物打死,那么最后一个回合的最后一下我使用技能不让对手打,那么怪物剩下b的血量,然后我把怪物打死需要使用技能[ b/a ] 向上取整次;
    对每一个数处理完上述四种情况之后,对由于要使用技能的怪物进行从小到达的排序即可;

(get到一个新技巧,只有菜的成狗的我才不知道向上取模可以用(a+b-1)/b吧)

#include <bits/stdc++.h>
using namespace std;
int ans[200010];
int main()
{
	
	int n,a,b,k;
	cin >>n>>a>>b>>k;
	int cnt=0,cot=0;
	for(int i=0;i<n;i++)
	{
		int x;
		cin >>x;
		int y=x%(a+b);
		if(y<=a&&y) cnt++;
		if(!y) ans[cot++]=(a+b-1)/a;
		if(y>a)
		{
			y-=a;
			ans[cot++]=(a+y-1)/a;
		}
	}
	sort(ans,ans+cot);
	for(int i=0;i<cot;i++)
	{
		k-=ans[i];
		if(k<0) break;
		cnt++;
	}
	cout <<cnt<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值