Codeforces Round #556 (Div. 2) A~C题

A题:

https://codeforces.com/contest/1150/problem/A

题目看了我半天

大意就是给你k块钱,有n种购买方法,m种卖出方法

选少的买,大的卖。。。。。水的不行这题。。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n,m,r;
	cin>>n>>m>>r;
	int buy=0x3f3f3f3f,sel=-1;
	for(int i=1;i<=n;i++){
		int inp; cin>>inp;
		if(buy>inp) buy=inp;
	}
	for(int i=1;i<=m;i++){
		int inp; cin>>inp;
		if(sel<inp) sel=inp;
	}
//	cout<<buy<<"  "<<sel<<endl;
	if(buy<sel){
		int a=r/buy;
		int b=r%buy;
		cout<< b+ a*sel;
	}
	else cout<<r;
	return 0;
}

 

 

B题:

题目:https://codeforces.com/contest/1150/problem/B

这道题是翻转问题的裸题

大体就是从上到下搜索,假如第一行有一个需要翻转,那么翻转点一定是那个点下面,假如无法翻转,那么就不行。

从1~n-2行搜索,最后检查n-1~n 行有没有没被翻过来的,有的话就输出NO

然鹅我还是被hack了(菜)

 

#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
bool M[maxn][maxn];
bool turn(int i,int j){
	M[i][j]=1;
	for(int k=j-1;k<=j+1;k++){
		if(!M[i+1][k]) M[i+1][k]=1;
		else return false;
	}
	if(!M[i+2][j]) M[i+2][j]=1;
	else return false;
	return true;
}
int main() {
	char s[55];
	int n,m; cin>>n;
	m=n;
	for(int i=1;i<=n;i++){
		cin>>s;
		for(int j=1;j<=m;j++){
			if(s[j-1]=='#') M[i][j]=1;
		}
	}
	int flag=1;
	for(int i=1;i<=n-2;i++){
		for(int j=1;j<=m;j++){
			if(!M[i][j]){
				if(j==1||j==m) flag=0;
				else if(!turn(i,j)) flag=0;
			}
		}
	}
	for(int i=n-1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(!M[i][j]) flag=0;
		}
	}
	if(flag) cout<<"YES";
	else cout<<"NO";
	return 0;
	
}

 

C题:https://codeforces.com/contest/1150/problem/C

这题考的就是一个素数筛吧,还有一个是贪心,前面能放2就放2,不可以再放1

#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5000;
int prime[maxn];
int find_prime(int num){ 
	bool flag[maxn];
	memset(flag,0,sizeof(flag));
	int count=0;
	for(int i=2;i<=num;i++){
		if(!flag[i]) prime[count++]=i;  
		for(int j=0;j<count&&i*prime[j]<=num;j++){
			flag[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
	return count;
} 
int main() {
	int n;  cin>>n;
	int one=0,two=0;
	int inp;
	for(int i=1;i<=n;i++){
		scanf("%d",&inp);
		if(inp==1) one++;
		else two++;
	}
	int cnt=find_prime(maxn);
	int flag=0,sum=0;
	for(int i=1;i<=n;i++){
		int ok=0;
		while(sum+2<=prime[flag]&&two>0){
			sum+=2;
			two--;
			ok=1;
			printf("%d ",2);
		}
		
		while(1+sum<=prime[flag]&&one>0){
			sum++;
			one--;
			printf("%d ",1);
			ok=1;
		}
		flag++;
		if(ok==0) break;
	}

	while(one>0) printf("%d ",1),one--;
	while(two>0) printf("%d ",2),two--; 
	return 0;
	
}

 

后面的我就没做了,补题假如做得出来再发。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值