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
对于每一个怪物的血量都进行贪心,如果我要先把这个怪物杀死,到我打的时候我必须把他杀死,到对手打的时候如果对手能把他杀死,就使用技能不让他打,然后我打,一直把他打死;这样就出现以下几种情况:
- 怪物血量mod上(a+b)之后小于a,也就是n个回合之后还是我先手,此时我能把怪物打死;
- 怪物血量mod上(a+b)之后大于a,然后我再输出a的伤害i,此时怪物剩下y的血量,这些血量需要我使用技能的次数为 [ y/a ]代表向上取整;
- 怪物血量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;
}