Codeforces Round 929 (Div. 3)

A:Turtle Puzzle:Rearrange and Negate

题面:

Problem - A - Codeforces

分析:

贪心

先将所有负数放到一起,然后变成正数,最终答案是所有元素的绝对值之和

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e2+10,M=1e9+7;
int n; 
int a[N];
void solve()
{
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		ans+=abs(a[i]);
	}
	cout<<ans<<'\n';
}
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();	
	}	
	return 0;
} 

B:Turtle Math:Fast Three Task

题面:

Problem - B - Codeforces

分析:

分类讨论

开一个桶数组记录数组中%3后各种结果的个数

算出原始数组所有元素之和%3的值sm,分情况讨论:

sm=0,原本就是3的倍数,答案为0

sm=1,如果vis[1]>0(vis[1]表示%3=1的元素的个数),移除其中一个元素即可,答案为1;如果vis[1]=0,那么随便选一个元素将其数值加2即可,答案为2

sm=2,那么随便选一个元素将其数值加1即可,答案为1,其他方法不会更优

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=1e9+7;
int n;
int a[N],vis[4];
void solve()
{
	cin>>n;
	int sm=0;
	for(int i=0;i<4;i++){
		vis[i]=0;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]%=3;
		sm=(sm+a[i])%3;
		vis[a[i]]++;
	}
	if(sm==0){
		cout<<0<<'\n';
	}else if(sm==1){
		if(vis[1]){
			cout<<1<<'\n';
		}else{
			cout<<2<<'\n';
		}
	}else if(sm==2){
		cout<<1<<'\n';
	}
}
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();	
	}	
	return 0;
} 

C:Turtle Fingers:Count the Values of k

题面:

Problem - C - Codeforces

分析:

暴力

暴力枚举x,y,找到对应的k,去重即可,算次幂可以用快速幂

时间复杂度O(t log l log l)

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=2e5+10,M=1e9+7;
int a,b,l;
int fastpow(int a,int n)//快速幂
{
	int ans=1;
	while(n)
	{
		if(n&1){
			ans*=a;
		}
		a*=a;
		n>>=1;
	}
	return ans;
}
void solve()
{
	cin>>a>>b>>l;
	int k;
	set<int> st;//集合去重
	for(int i=0;fastpow(a,i)<=l;i++){//暴力
		int ax=fastpow(a,i);
		if(l%ax==0){
			for(int j=0;fastpow(b,j)<=l/ax;j++){
				int by=fastpow(b,j);
				if(l/ax%by==0){
					st.insert(l/ax/by);
				}else{
					break;
				}
			}
		}else{
			break;
		}
	}
	cout<<st.size()<<'\n';
}
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();	
	}	
	return 0;
} 

D:Turtle Tenacity:Continual Mods

题面:

Problem - D - Codeforces

分析:

贪心

首先对数组从小到大排个序

可以发现,当最小的元素只有一个时,可以直接按这个顺序进行mod,结果是a[1]!=0,YES

如果最小元素不止一个,那么可以通过其他元素用取模的方式构造一个更小的元素放在第一个位置,如果能构造,YES;否则NO

判断能否,如果其它元素都是最小元素的倍数,那么不能构造;如果不是,则能构造

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=998244353;
int n;
int a[N];
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	if(a[2]==a[1]){
		for(int i=3;i<=n;i++){
			if(a[i]%a[1]){
				cout<<"YES"<<'\n';
				return;
			}
		}
	}else{
		cout<<"YES"<<'\n';
		return;
	}
	cout<<"NO"<<'\n';
}
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();	
	}	
	return 0;
} 

E:Turtle vs. Rabbit Race:Optimal Trainings

题面:

Problem - E - Codeforces

分析:

二次函数、前缀和、二分

首先题意,对于一个数组,给你一个l,让你选最小的r使:

k=\sum_{i=l}^{r}a_{i}

对于给定的u令:

\sum \mu (\mu -1)...(\mu-k+1)

最大

那么,\sum \mu(\mu-1)...(u-k+1)=\frac{(2\mu-k+1)k}{2}=-\frac{1}{2}k^2+\frac{2\mu+1}{2}k,当k=\mu+\frac{1}{2}时取得最大值,找最接近这个值并且最左边的k所对应的r即可

前缀和处理,有sum[r]-sum[l-1]=k\Rightarrow sum[r]=sum[l-1]+k

二分前缀和数组找到第一个大于等于u+1的k,即找到第一个大于等于sun[l-1]+k的sum[r]

如果r>n,r取等于n

比较左右两边表达式的值(应该要开long long),如果左边大于等于右边,r--

如果r<l,r取等于l

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=1e9+7;
ll n,q;
ll a[N],sum[N];
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	cin>>q;
	while(q--){
		ll l,u;
		cin>>l>>u;
		ll r=lower_bound(sum+1,sum+n+1,u+sum[l-1]+1)-sum;
		if(r>n){
			r--;
		}
		ll left=sum[r-1]-sum[l-1],right=sum[r]-sum[l-1];
		if(2*u*left-left*left+left>=2*u*right-right*right+right){//左右比较,/2消掉了
			r--;
		}
		if(r<l){
			r=l;
		}
		cout<<r<<" ";
	}
	cout<<'\n';
}
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int T=1;
	cin>>T;
	while(T--)
	{
		solve();	
	}	
	return 0;
} 

F:Turtle Mission:Robot and the Earthquake

题面:

Problem - F - Codeforces

G:Turtle Magic:Royal Turtle Shell Pattern

题面:

Problem - G - Codeforces

  • 49
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值