Codeforces Round #560 (Div. 3)

A. Remainder

题意:给定字符串,确定没有前置0,求使得字符串模10^y后剩余10^x;

思路:按题意模拟。。。

#include<bits/stdc++.h>
using namespace std;
char s[200005];
int main(){
	int n,x,y;
	scanf("%d%d%d",&n,&x,&y);
	string s;
	cin>>s;
	int ans=0;
	int l=s.size();
	for(int i=l-1;i>=l-y;i--){
		if(s[i]=='1')
			ans++;
	}
	if(s[l-y-1]=='0')
		ans++;
	for(int i=l-y-2;i>=l-x;i--){
		if(s[i]=='1')
			ans++;
	}
	printf("%d\n",ans);
}

B. Polycarp Training

题意:给定n个比赛,每场比赛有ai个题目,他第i天最多做i个题目,如果少于i个题目那么就不做,求最多可以做几天题。

思路:模拟。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005];
int n;
int main()
{
    scanf("%d",&n);
	for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
	int ans=1;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
		if(a[i]>=ans)
		ans++;
		else continue;
	}
	printf("%d\n",ans-1);
	return 0;
}

C. Good String

题意:给定字符串,如果长度是偶数并且偶数位与他的后一位不同,那么这字符串就是好的,求删除的最少次数,并输出好的字符。

思路:栈模拟。

#include<bits/stdc++.h>
using namespace std;
int vis[200005];
stack<char>s1;
int main(){
	int n;
	scanf("%d",&n);
	memset(vis,0,sizeof(vis));
	string s,t,str;
	cin>>s;
	str=s;
	int ans=0,l=s.size();
	s1.push(s[0]);
	int f=0;
	for(int i=0;i<l;i++){
		if(s[i]==s1.top()&&f==0){
			continue;
		}
		else {
			s1.push(s[i]);
			f=!f;
		}
	}
	if((s1.size())%2==0){
		printf("%d\n",l-s1.size());
		while(!s1.empty()){
			t+=s1.top();
			s1.pop();
		}
		for(int i=t.size()-1;i>=0;i--)
			printf("%c",t[i]);
	}
	else{
		s1.pop();
		printf("%d\n",l-s1.size());
		while(!s1.empty()){
			t+=s1.top();
			s1.pop();
		}
		for(int i=t.size()-1;i>=0;i--)
			printf("%c",t[i]);
	}
}

D. Almost All Divisors

题意:给定一个数的因子,判断这个数是否存在,存在输出此数。

思路:最大乘最小,如果该数的因子数等于n-2并且该数可以整除所有的数那么该数就是要求的数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[305];
ll count(ll a)
{
	ll sum=0;
	for(ll i=1;i<=sqrt(a);i++)
	{
		if(a%i==0)
		{
			sum++;
			if(a/i!=i)sum++;
		}
	}
	return sum-2;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		ll n,b;
		scanf("%lld",&n);
		ll ans=1;
		ll mx=-5,mn=1e6+5;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			mx=max(mx,a[i]);
			mn=min(mn,a[i]);
		}
		ans=mn*mx;
		if(count(ans)!=n)
			printf("-1\n");
		else {
			int f=0;
			for(int i=1;i<=n;i++){
				if(ans%a[i]!=0){
					f=1;
					break;
				}
			}
			if(f==0){
				printf("%lld\n",ans);
			}
			else puts("-1");
		}	
	}
	return 0;
}

E. Two Arrays and Sum of Functions

题意:f(l,r)=∑l≤i≤rai⋅bif(l,r)=∑l≤i≤rai⋅bi.重新排序b数组,使得∑1≤l≤r≤nf(l,r)∑1≤l≤r≤nf(l,r) 最少。

思路:ai的贡献是ai*i*(n-i+1),那么我们排序两个数组使得最少乘以最大。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1000005],b[1000005];
const int mod=998244353;
int main(){
	int n;
	scanf("%d",&n);
	for(ll i=1;i<=n;i++)
		scanf("%lld",&a[i]),a[i]=1ll*a[i]*(i)*(n-i+1);
	for(int i=1;i<=n;i++)
		scanf("%lld",&b[i]);
	sort(a+1,a+1+n);
	sort(b+1,b+n+1);
	ll ans=0;
	for(int i=1;i<=n;i++){
		ans=(ans+((a[i]%mod)*b[n-i+1]%mod)%mod)%mod;
	}
	printf("%lld\n",ans);
} 

F1. Microtransactions (easy version)

F2. Microtransactions (hard version)

题意:每天可以得到一块钱,有些商品要买,在优惠那天要1块钱,否则要2块钱,求最少花费多少钱可以买所有商品。

思路:二分。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
ll a[N],b[N];
vector<int>v[N<<1];
int n,m;
ll sum;
bool check(ll mid){
	ll s=0;
	ll temp=sum;
	for(int i=1;i<=n;i++)
		b[i]=a[i];
	for(ll i=mid;i>=1;i--){
		for(int j=0;j<v[i].size();j++){
			while(b[v[i][j]]&&mid){
				mid--;
				temp--;
				b[v[i][j]]--;
			}
		}
		if(mid>=i){
			mid--;
			s++;
		}
	}
	return s/2>=temp;
}
int main(){
	sum=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		sum+=a[i];
	}
	int d,t;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&d,&t);
		v[d].push_back(t);
	}
	ll l=sum,r=2*sum,ans;
	while(l<=r){
		ll mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	printf("%lld\n",ans);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值