【题解】 模拟赛2

T1

假设商品价格为x
618:int(x*0.66)
211:x-(x/100)*35
两者比较一下大小即可

#include<bits/stdc++.h>
using namespace std;

int x,x1,x2;

int main(){
	scanf("%d",&x);
	x1 = x*0.66;
	x2 = x-(x/100)*35;
	if (x1 == x2) printf("both\n%d",x1);
	if (x1 > x2) printf("211\n%d",x2);
	if (x1 < x2) printf("618\n%d",x1);
	return 0;
}

T2

利用两个变量分别存储跳舞的天数和不跳舞的天数
如果跳舞的天数大于不跳舞的天数,那就是YES,否则就是NO
然后再把两个变量输出就可以

#include<bits/stdc++.h>
using namespace std;

int n;
int sl,sy;

int main(){
	scanf("%d",&n);
	for (int i = 1; i <= n; i++){
		int x; cin>>x;
		if (x == 0) sl++; else sy++;
	}
	if (sy > sl) printf("YES\n%d %d",sy,sl);
	else printf("NO\n%d %d",sy,sl);
	return 0;
}

T3

假设一个数x
令S= x 2 x^2 x2
如何从S的末尾中取出和x相同位数的数呢?
我们需要知道x的位数为m
那么令S% 1 0 m 10^m 10m就能得到末尾的数

如果相同,那么就是自守数,累加后输出即可

#include<bits/stdc++.h>
using namespace std;

int a,b,cnt;
int f[101000];

bool Check(int x){
	int X = x*x,XX = x;
	int xx = 1;
	while (x) xx*=10,x/=10;
	if (X%xx == XX) return 1;
	return 0;
}

void Work(int x){
	if (Check(x)) f[++cnt] = x;
	return;
}

int main(){
	scanf("%d %d",&a,&b);
	for (int i = a; i <= b; i++) Work(i);
	printf("%d\n",cnt);
	for (int i = 1; i <= cnt; i++) printf("%d\n",f[i]);
}

T4

首先看题目:
这个油管是东西向
所以我们只需要考虑油田的纵坐标而不需要管横坐标
那么如何放置主管道才能使距离和最小呢?
我们假设先把油管放到最下面的油井中
此时得到一个距离 S S S
那么,我们将管道往上移一格
此时距离会变成多少呢?
不难想出
此时,第一个油井到他的距离会多1,而第2~n个油井的距离到他的距离就会少1
减少的距离大于增加的距离,就意味着我们仍然可以往上移

于是我们一直移……
移到什么时候,减少的会和增加的相等,或者减少的会小于增加的呢?
不难想到,就是中间的时候,减少的会等于增加的,再上去,减少的就会小于增加的,距离就会变长了

所以,距离最小的时候,就是把主管道放在中位数位置的时候。

那么知道主管道的位置了,距离和算一下也就简单了

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+100;
int n;
int a[N],ans = 0;


int main(){
	freopen("1.in","r",stdin);
	freopen("1.out","w",stdout);
	scanf("%d",&n);
	for (int i = 1; i <= n; i++) scanf("%d %d",&a[i],&a[i]);
	sort(a+1,a+n+1);
	int d = a[(1+n)/2];
	for (int i = 1; i <= n; i++) ans+=abs(d-a[i]);
	printf("%d",ans);
}

T5

一、60分

01背包即可,不再赘述

100分

贪心
贪心策略1毫无疑问,我们肯定希望吃到尽可能美味的鱼
因此我们需要将体积1的鱼和体积2的鱼分别按照美味值从大到小排序。

接下来如何贪心呢?
首先我们用体积为2的鱼将背包都填满,如果体积还剩余,那么再用体积为1的鱼去补上余下体积

这时候有的同学就会问了;
我们难道只用体积为2的鱼,体积为1的鱼不用了吗?

非也,
我们知道,两条体积为1的鱼可以去代替一条体积为2的鱼
所以,
我们先用体积为2的鱼填满背包,而后再一次用两条体积为1的鱼去尝试替代体积为2的鱼。

如果两条体积为1的鱼的美味值大于一条体积为2的鱼,那么就可以替代
直到无法替代为止
最后分别把大鱼和小鱼的答案累加即可

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
int o[N],t[N];
int leno,lent;
int n,v;
int nowo,nowt;

bool cmp(int x,int y){
	return x>y;
}

int main(){
	scanf("%d %d",&n,&v);
	for (int i = 1; i <= n; i++){
		int x,y; scanf("%d %d",&x,&y);
		if (x == 1) o[++leno] = y;
		else t[++lent] = y;
	}
	sort(o+1,o+leno+1,cmp);
	sort(t+1,t+lent+1,cmp);
	if (v == 1) {printf("%d",o[1]);return 0;}
	if (lent*2>=v){
		nowt = v/2;
		if (v%2 == 1) nowo = 1;
	}
	else {
		nowt = lent;
		nowo = v-2*nowt;
	}
	while (nowo <= leno && nowt){
	    if (o[nowo+2]+o[nowo+1]>t[nowt]) nowt--,nowo+=2;
	    else break; 
	}
	int ans = 0;
	for (int i = 1; i <= nowo; i++) ans+=o[i];
	for (int i = 1; i <= nowt; i++) ans+=t[i];
	printf("%d",ans);
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值