2020年浙大城市学院新生程序设计竞赛(同步赛)

这个比赛好芳香 啊啊啊啊 压力马斯达

2020年浙大城市学院新生程序设计竞赛同步赛

A 年轻人是不讲5的

众所周知,年轻人是不讲5的。作为年轻人,你应该继承这样的“优良传统”。
给定一个数串,输出时将其中的数字’5’替换成字符’*’。

签到题

string s;
	cin>>s;
	int l=s.size();
	for(int i=0;i<l;i++){
		if(s[i]=='5')s[i]='*';
	}
	cout<<s<<endl;

B 计算函数最大值

因为n很小,可以直接按题意一个一个算
注意约分

#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<fstream>
#include<cmath>

using namespace std;

double fun(int a,int b,int c){
	return ((double)a*(double)c+(double)b)/(double)pow(2,(double)c);
}
int gcd(int a,int b){
	if(a%b==0)return b;
	else return gcd(b,a%b); 
}
int main(){
//	freopen("1.txt","r",stdin);
//	freopen("2.txt","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		int a,b,n;
		scanf("%d%d%d",&a,&b,&n);
		int idx=0;
		for(int i=1;i<=n;i++){
			if(fun(a,b,i)>fun(a,b,idx))idx=i;
		}
		int x=a*idx+b;
		int y=pow(2,idx);
		if(x==0)cout<<0<<endl;
		else if(abs(x)%y==0) cout<<x/y<<endl;
		else {
			int z=gcd(abs(x),y);
			cout<<x/z<<'/'<<y/z<<endl;
		}
	}
	
	return 0;
} 
 

F 喝酒II

题目是这样的:给出A,B,C三种饮料各自的数量,有三种鸡尾酒D,E,F的调制规则:
1A+1B=1D(使用一杯A饮料和一杯B饮料可以调制出一杯D鸡尾酒,下面两种规则以此类推)
1A+1C=1E
1C+1C=1F
现在,Hile要求出能调出的鸡尾酒的最大数量,但是 Hile太菜了,于是便来向你寻求帮助,你能告诉她答案吗?

一个贪心,依次用B,A,C尽量用完

	int a,b,c;
	cin>>a>>b>>c;
	if(a<=b){
		cout<<a+c/2;//先是b
	}
	else {
		a-=b;//用公式a把a用光
		if(a>=c){
			cout<<b+c;
		} 
		else{
			cout<<b+a+(c-a)/2;
		}
	}

H 多少人AK?

新生赛开赛在即,Kwords打算预测每道题的过题人数,现在他想知道如果按照他预测的过题数据,会有多少人能够AK(全部通过)或爆零(无法通过任何一道题)呢。因为Kwords并不知道榜单实际的过题情况,所以希望你能帮助他预测AK和爆零的人数区间。
输入描述:
第一行给出一个正整数T(1≤T≤10),表示接下来会给出T组测试数据。
对于每组测试数据,
第一行给出两个正整数N(1≤N≤10^5) 表示新生赛有多少个题目,
M(1≤M≤10^9 )表示参赛人数。
第二行给出N个数字,第i个数字表示第i{}i道题通过的人数a i(0≤ ai≤ M)。
输出描述:
对于每组数据,第一行给出两个数字L1,R1表示AK的人数在区间[L1,R1]内,第二行给出两个数字L2,R2表示爆零的人数在区间[L2,R2] ]内。

输入

2
2 20
19 19
4 5
1 1 1 1

输出

18 19
0 1
0 1
1 4

最少ak的人:把解出每道题的人数改成没做出的人数
每道题都有m-ai个人做不出,让这些做不出的尽可能是不同的人
最多AK的人:ai里最小的
最多爆零的人:做出的题尽可能是同样的人
最少爆零的人:m-ai里最大的

#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<fstream>
#include<vector>
typedef long long ll;
using namespace std;
int main() {
	//freopen("4.txt", "r", stdin);
	//freopen("5.txt", "w", stdout);
	ll T;
	cin >> T;
	while (T--) {
		vector<ll> v;
		ll n, m, sum = 0;//n题m人 
		scanf("%d%d", &n, &m);
		for (ll i = 0; i < n; i++) {
			ll x;
			scanf("%d", &x);
			v.push_back(x);
			sum += x;
		}
		sort(v.begin(), v.end());
		ll z = n * m - sum;
		cout << max((ll)0, m - z) << " " << v[0] << endl;
		cout << max(m - sum,(ll)0) << " " << m - v[n - 1] << endl;
	}
	return 0;
}

L 不要114514

题意:改变尽可能少的数字,不要形成114514
因为可以输出任意一种可以的串
策略:
所有可能在修改数字后再次形成114514的情况如下

114514
1114514
11114514
114114514//把114514串里第一个1改成4
1145114514//把114514串里第一个1改成5
11451114514
其余都把那个1改成5
形成414,515 这样子就不会出现修改后出现114514的情况啦
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<fstream>
#include<cmath>
#include<fstream>
using namespace std;
int n,a[200005];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<n-5;i++){
		if(a[i]==1&&a[i+1]==1&&a[i+2]==4&&a[i+3]==5&&a[i+4]==1&&a[i+5]==4){
			if(i<=2||(a[i-1]==1))a[i]=5;
			else if(a[i-1]==4)a[i]=4;
			else if(a[i-1]==5)a[i]=5;
		}
	}
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	return 0;
} 
 

赛后补题

K 卷GPA

在这里插入图片描述

第三次试图用优先队列偷懒失败
用结构体将a,b序列相对应的数“绑定”,a,b序列的值是对应的,排序后老老实实扫一扫就好了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
const long long N=1e6+7;
struct node
{
    int x;
    int y;
    bool operator<(const node& v){
        return x<v.x;
    }
}a[N];
int sum[N];
int main() 
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) 
        cin>>a[i].x;
    for(int i=1;i<=n;i++) 
        cin>>a[i].y;
    sort(a+1,a+n+1);
    for(int i=n;i;i--)
        sum[i]=max(sum[i+1],a[i].y);
        //提前存好b序列在每个位置之后序列的最大值
    int ans=0x3f3f3f3f;
    for(int i=0;i<=n;i++)
        ans=min(ans,sum[i+1]+a[i].x);
    cout<<ans<<endl;
    return 0;
}

E 喝酒I

感谢雷神仙纠正了我错误的思路

k是一样的,然后剩下的必须是p的幂和q的幂
不能有其他数

看注释即可

#include<iostream>
using namespace std;
const int N=2e5+10;
bool c[N];//存储可能的k值
long long a,b,p,q;
bool f;
int main(){
    cin>>a>>b>>p>>q;
    if(a%p||b%q||!a||!b){
        printf("No\n");
        return 0;
    }//特判一下
	a/=p;b/=q;//存在正整数x,y
    c[a]=1;//x可能是1,所以这个不能忘记
    if(p!=1)
        while(!a%p)
            a/=p,c[a]=1;
    //首先p等于1就就只有a一个了,这一步把p的倍数先全部判一下
    if(q==1&&c[b]&&b>1){printf("Yes\n");return 0;}//如果b 
    if(q!=1){
    	if(c[b]&&b>1){printf("Yes\n");return 0;}//先判断一下y==1的情况 
        while(!b%q){
            b/=q;//时刻注意k>=2
            if(c[b]&&b>1){printf("Yes\n");return 0;}//y==2,3,4找到相同的k直接除掉 
        }
    }
    printf("No\n");//扫完了没return,说明没有 
    return 0;
}

D 8的倍数

8倍数的特征

/*        
016 104 112 120 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240 
024 248 256 264 272 280 288 296  
032 304 312 320 328 336 344 352 360 368 376 384 392  
040 048 400 408 416 424 432 440 448 456 464 472 480 488 496 
056 504 512 520 528 536 544 552 560 568 576 584 592
064 600 608 616 624 632 640 648 656 664 672 680 688 696 
072 704 712 720 728 736 744 752 760 768 776 784 792 
008 080 88 800 808 816 824 832 840 848 856 864 872 880 888 896 
096 904 912 920 928 936 944 952 960 968 976 984 992 
*/
//全为偶数,最后三位被8整除 

试图打表失败的废墟
应该是搜索

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值