Codeforces Round #617 (Div. 3) ABCD
https://codeforces.com/contest/1296
临时和Juang一起组队打的这场,本来定的分开打另一场,哈哈
题目挺友好的,Juang 70min AK了,我只写了四题,剩下的题目待补
A. Array with Odd Sum
题目大意:
给定n个数字,问我们在这一种操作下:ai变成aj;
能不能让总和为奇数?
input
5
2
2 3
4
2 2 8 8
3
3 3 3
4
5 5 5 5
4
1 1 1 1
output
YES
NO
YES
NO
NO
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL ji=0,ou=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%2==1) ji++;
else ou++;
}
if(n%2==1&&ji>=1) cout<<"YES"<<endl;
else if(n%2==0&&ji>=1&&ou>=1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B. Food Buying
题目大意:
给定钱数n,每次我们花m块钱,就可以返回m/10块钱给我们
问我们最多花了多少钱?
input
6
1
10
19
9876
12345
1000000000
output
1
11
21
10973
13716
1111111111
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL sum=n;
while(n>=10)
{
sum+=n/10;
n=n/10+n%10;
}
cout<<sum<<endl;
}
return 0;
}
C. Yet Another Walking Robot
题目大意:
一开始机器人的坐标位于(0,0);每次给定四个方向,让我们在保持最后到达的点不变的基础上,最小化删除字符串的长度。
input
4
4
LRUD
4
LURD
5
RRUDU
5
LLDDR
output
1 2
1 4
3 4
-1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
string s;
cin>>s;
s=" "+s;
//cout<<s<<endl;
map<PII,LL> mp;
LL x=0,y=0,l=0,r=0,len=1e9;
mp[{x,y}]=1;
for(LL i=2;i<s.size();i++)
{
if(s[i]=='L')
{
if(mp[{x-1,y}])
{
if((i-mp[{x-1,y}]+1)<len)
{
len=i-mp[{x-1,y}]+1;
l=mp[{x-1,y}]+1,r=i;
}
}
x--;
mp[{x,y}]=i;
}
else if(s[i]=='R')
{
if(mp[{x+1,y}])
{
if((i-mp[{x+1,y}]+1)<len)
{
len=i-mp[{x+1,y}]+1;
l=mp[{x+1,y}]+1,r=i;
}
}
x++;
mp[{x,y}]=i;
}
else if(s[i]=='U')
{
if(mp[{x,y+1}])
{
if((i-mp[{x,y+1}]+1)<len)
{
len=i-mp[{x,y+1}]+1;
l=mp[{x,y+1}]+1,r=i;
}
}
y++;
mp[{x,y}]=i;
}
else if(s[i]=='D')
{
if(mp[{x,y-1}])
{
if((i-mp[{x,y-1}]+1)<len)
{
len=i-mp[{x,y-1}]+1;
l=mp[{x,y-1}]+1,r=i;
}
}
y--;
mp[{x,y}]=i;
}
//cout<<x<<" "<<y<<endl;
}
if(l==0&&r==0) cout<<"-1"<<endl;
else cout<<l-1<<" "<<r-1<<endl;
}
return 0;
}
D. Fight with Monsters
题目大意:
给定一个长度为n的数组s,a是我的攻击力,b是对手的攻击力,我有k次魔法;
魔法的功能是可以每次当轮到对手攻击的时候,我可以不让他动,而让我动。(自动抵消一次他的操作)
对于这些怪兽,我们每次都可以自己选择打哪一个,并不是一定要严格按照下标值来进行攻击。
每次的攻击都是我先打,然后对手再打!!
问我们最优的情况下我们可以得到最多是多少分?(每次只要这个怪兽是在我的攻击下血量<=0的,那就意味着我的了一分,对手打死了的和我的得分没有关系)
input
6 2 3 3
7 10 50 12 1 8
output
5
input
1 1 100 99
100
output
1
input
7 4 2 1
1 3 5 4 2 7 6
output
6
读了好久的假题,我跌,不然早开出了,慢的一批
- 每次自己可以打死的,那就直接计数,如果在我打不死这个怪兽的情况下,就看看我需要多少步能打死这个怪兽?
- 如果我的k满足步数的话,直接计数,不然就只能让队友打死了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL sum[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n,a,b,k;
cin>>n>>a>>b>>k;
LL ans=0;
for(LL i=1;i<=n;i++)
{
cin>>sum[i];
sum[i]%=(a+b);
if(sum[i]==0) sum[i]=a+b;
}
sort(sum+1,sum+1+n);
/*for(LL i=1;i<=n;i++)
{
cout<<sum[i]<<" ";
}
cout<<endl;*/
for(LL i=1;i<=n;i++)
{
if(sum[i]<=a) ans++;
else
{
sum[i]-=a;
LL flag=sum[i]/a;
if(sum[i]%a!=0) flag++;
if(k>=flag)
{
k-=flag;
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}