Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round)A-C

A. Maximum Cake Tastiness

简单来说就是找到最大值和次大值,输出他们的和

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
int main()
{
	int tt;scanf("%d",&tt);
	int n,d,maxa,maxb;
	for(int j=0;j<tt;j++){
		scanf("%d",&n);
		maxa=0,maxb=0;
		for(int i=0;i<n;i++){
			scanf("%d",&d);
			if(d>=maxa){
				maxb=maxa;maxa=d;
			}
			else if(d<maxa&&d>maxb) maxb=d;
		}
		printf("%d\n",maxa+maxb);
	}
	return 0;
}
 
 

B. Prefix Removals

 假设位置字符串位置i,如果在i之后没有与i相同的字符,就从这个位置开始输出字符串剩余部分,否则查i+1

实际上只要储存a到z所有字符最后出现的位置,找到其中最小的位置,从该位开始输出

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>

char x[200005];

int main()
{
	int tip[26]={0},num[26]={0};
	int tt;scanf("%d",&tt);getchar();
	for(int j=0;j<tt;j++){
		gets(x);
		for(int i=0;i<26;i++){
			tip[i]=200005;
		}
		int l=strlen(x);
		for(int i=0;i<l;i++){
			tip[x[i]-'a']=i;
		}
		int min=200005;
		for(int i=0;i<26;i++){
			if(tip[i]<min) min=tip[i];
		}
		puts(x+min);
	}
	return 0;
}

C. Alice and the Cake

一块蛋糕每次只能对半切

思路应该没问题,但是快排O(n^2*logn)第六个点超时,改成插入(n*(logn)^2)之后第九个点超时,改不动了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>

long long int num[200005]={0},tip[200005]={0};


int cmpfuncnum (const void * a, const void * b)
{
	return ( *(long long int*)b - *(long long int*)a );
}
int cmpfunctip (const void * a, const void * b)
{
	return ( *(long long int*)a - *(long long int*)b );
}

int main()
{
	int tt;scanf("%d",&tt);
	while(tt--){
		int n,tipl=2,nb=0;scanf("%d",&n);
		long long int all=0;
		if(n==1) {
			scanf("%lld",&all);
			printf("YES\n");
			continue;
		}
		for(int i=1;i<=n;i++){
			scanf("%lld",&num[i]);
			all+=num[i];
			tip[i]=0;
		}
		if(all/n==1&all%n==0){
			printf("YES\n");
			continue;
		}
		qsort(num+1, n, sizeof(long long int), cmpfuncnum);
		if(all%2==1){
			tip[1]=all/2;tip[2]=all/2+1;
		}
		else{
			tip[1]=tip[2]=all/2;
		}
		for(int i=1;i<=n;i++){
			if(tip[tipl]==num[i]){
				tip[tipl]=0;
				tipl--;
			}
			else{
				while(tip[tipl]>num[i]){
					if(tip[tipl]%2==0){
						tip[tipl]=tip[tipl]/2;
						tip[tipl+1]=tip[tipl];
						int ip=tipl-1;long long int kk;
						while(tip[ip]>tip[ip+2]){
							kk=tip[ip];tip[ip]=tip[ip+2];tip[ip+2]=kk;ip--;
						}
					}
					else{
						tip[tipl]=tip[tipl]/2+1;
						tip[tipl+1]=tip[tipl];
						int ip=tipl-1;long long int kk;
						while(tip[ip]>tip[ip+2]){
							kk=tip[ip];tip[ip]=tip[ip+2];tip[ip+2]=kk;ip--;
						}
						kk=tip[ip+1];
						while(tip[ip]==tip[ip+1]) ip--;
						tip[ip+1]=kk-1;
					}
					tipl++;
					//printf("tipl:%d\n",tipl);
					//for(int j=1;j<=tipl;j++) printf("%d ",tip[j]);
					//printf("\n");
					if(tipl>n){
						printf("NO\n");
						nb=1;
						break;
					}
				}
				
				if(nb==1) break;
				if(tip[tipl]==num[i]){
					tip[tipl]=0;
					tipl--;
				}
				else{
					printf("NO\n");
					nb=1;
					break;
				}
			}
		}
		if(nb==0) printf("YES\n");
	}
	return 0;
}

3-28:

花时间看了一下c++中map和queue的操作,把这个题目写出来了

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

long long int num[200005]={0};

int main()
{
	long long int tt;scanf("%lld",&tt);
	while(tt--){
		map <long long,long long> fid;
		long long int n,all=0;scanf("%lld",&n);
		for(int i=1;i<=n;i++) {
			scanf("%lld",&num[i]);
			fid[num[i]]++;
			all+=num[i];
		}
		queue<long long> que;que.push(all);
		for(int i=1;i<=10*n&&que.size()>0;i++){
			all=que.front();que.pop();
			if(fid[all]) fid[all]--;
			else{
				que.push(all/2);
				que.push((all+1)/2);
			}
		}
		if(que.size()) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值