校赛题解(部分)+反思

先来反思,学了那么久,一比赛。。。。
比赛时B题卡住了,一直错,wa11次,心态爆炸。。。
比赛过后,对自己的成绩做了反思,对自己平时的学习也进行了深刻反省。
通过这次比赛,我深刻认识到了自己的不足。
在比赛中wa那么多次,造成心态不稳。
但是,最主要的原因还是自己平常过于懈怠,训练不足。
在往常学习中,以刷视频为主,看知识点及大佬刷题视频,没有在学习之后进行训练,造成了“以为自己懂了”的假象,使自己不能认识到自己其实“训练严重不足,缺少逻辑”。在校赛中取得这样的成绩,内心十分愧疚及羞愧。
所幸还有改正的机会,在日后的学习中,要多训练自己,及时回顾,经常反思自己。在学习时,不能只是刷视频,看题解,自己要多想多练。在紧跟进度的同时,夯实自己的基础。

无上至尊的提案
Description

安兹用放在旁边的布稍微擦擦手,为最后一份魔导国的事务文件上盖章,这样工作就大略完成了。他将文件交给擦擦嘴角的雅儿贝德,她再转交给死者大魔法师们。

「好了,那么按照惯例进行那个吧,这些是今天的提议。」

安兹从抽屉里拿出事先准备好的纸,这是纳萨力克内所有人交上来的提案书,汇集了关于魔导国更进一步发展的提案与意见。

安兹会将这些提案一一过目,重抄一遍,在早晨的这个时段讲给雅儿贝德听。

「还劳烦安兹大人重抄一遍,这样会浪费您的宝贵时间的。」

「不,因为这里面可能有对我本人的提案。再说我不能睡眠,不找点事做太闲了。」

这是骗人的。不,不找点事做会太闲是真的。但安兹还要读书、入浴、做演技训练与战斗模拟等等,多的是事情杀时间。即便如此他还是想这样做,是因为——

其实这当中,也包含了安兹想到的点子。

只是,如果安兹直接提议,就算大家觉得这点子很烂,也有可能硬是执行,导致悲催的结果。所以他想隐藏起提案人的真实身份,让雅儿贝德用公正的眼光判断。而且隐藏真面目,安兹的能力就不会受到怀疑,可谓一举两得。

安兹念出第一项提案。

「唔……这份提案说『窃以为应该创立儿童教育机构。发掘并培养优秀人才,将来想必能够增强纳萨力克的力量。昨日在图书馆偶然遇到一个难题,百思不得其解,所以应当为纳萨力克培养相应的人才以应对此类难题』。」

安兹正面注视着雅儿贝德询问:

「你觉得这份提案怎么样?」

「窃以为真实愚蠢至极,猪就应该当一辈子的猪,然后为饲主做出贡献而死。它们没有必要过其他人生,也没有知道的意义或选择的权力……不过我对于这个难题有一些兴趣,可否请安兹大人允许我拜读一下。」

「准许。」

「『属下将会获得三个整数分别为a,b,c。属下可以随意运用乘或加这两种运算符号将三个整数连接起来使得运算结果最大。比如:对于1,2,3这三个整数,运算式 (1 + 2)× 3 的运算结果最大,结果为9』……这题目真是低级过头了,究竟是谁提出来的?」

安兹按捺住想说「对不起」的心情,装出一副伤脑筋的态度。

「不,这个——不知道,原本那张纸已经被我撕毁了。」

「真是受不了,竟然因为这种愚蠢透顶的题目,浪费安兹大人宝贵的时间。我认为应该进行审判调查,处以某些刑罚。」

「——不!不用了!听好了,雅儿贝德!千万别这么做。」

安兹虽然心中慌成一团,但仍然装出光明正大的态度。

「我对纳萨力克的所有人说过,我想听取多样化的意见,不管做出任何提案都不会怪罪。如果你去斥责那人,我就是出尔反尔了,这样今后我说什么,都会被当成谎言。如果大家因为这样而退缩,我就闻不到意见了……离开这个房间后,我要你忘了刚才这项提案。」

「是!全听安兹大人的吩咐!」

「很……很好。就这样做,那就进入下一个提案吧。」

很可惜安兹没能通过这种作弊的手段得到题目的解答,现在安兹扮演成飞飞前来咨询作为编程小能手的你,请给他解答。

Input
第一行输入一个整数T代表样例数量。接下来T行,每行一组样例包含3个整数a,b,c以空格隔开。

Output
输出T行,每行包含一组样例的答案。

数据范围:

(1<=T<=100),(-100 < a,b,c < 100)

Sample Input 1

3
1 2 3
1 1 1
2 1 3
Sample Output 1

9
3
9
Hint

对于第一组样例:(1 + 2) × 3 = 9

对于第二组样例: 1 + 1 + 1 = 3

对于第三组样例:(1 + 2) × 3 = 9

这道水题,一直错,一直错,今天敲了一遍,发现可能是分类没找全(记得有个找了八种,应该是有重复的)

#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
    int a,b,c;
    cin>>a>>b>>c;
  	int max1=a+b+c;
  	int max2=a+b*c;
  	int max3=(a+b)*c;
  	int max4=a*b+c;
  	int max5=a*(b+c);
  int max6=a*c+b;
  int max7=(a+c)*b;
  int max8=a*c*b;
  int maxx=max(max1,max2);
  int maxx=max(maxx,max3);
  int maxx=max(maxx,max4);
  int maxx=max(maxx,max5);
  int maxx=max(maxx,max6);
  int maxx=max(maxx,max7);
  int maxx=max(maxx,max8);
  cout<<maxx<<endl;
}

return 0;
}

Bob的难题
Description

Bob 有一个字符串s,但是他并不知道s具体是什么,他只知道s是由小写英文字母组成。现在定义一个字符串s′,s′是把s中所有的小写英文字母"a"去掉(其它字母的前后顺序保持不变)。此时Bob利用计算机产生了一个新的字符串T,T是由s和s′相连的,换句话说T=s+s′(s必须在s′前面)。

给你一个字符串T,你的任务是寻找一个字符串s满足给定的条件。如果可以找到,它将是唯一的。

Input
输入只有一行。输入一个只由小写英文字母组成的字符串T,T的长度不超过100000。

Output
输出只有一行。如果找到字符串s,输出一个字符串s;否则,输出 “😦” (没有引号);

数据范围:

T的长度∈[1,100000]

Sample Input 1
aaaaa

Sample Output 2
😦
Sample Output 3
ababacac
Sample Output 4
😦
Hint

第一个样例,s=“aaaaa”,s′="" 。

第二个样例,没有找到s 。

第三个样例,s=“ababacac”,s′=“bbcc”。

第四个样例,没有找到s 。

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main()
{
string t,s,s1,sa;
cin>>t;
int cnt=0;
for(int i=0;i<t.length();i++)
{
    if(t[i]=='a')
    cnt++;//记录a的个数
    else
    sa=sa+t[i]; 
}
int lent=t.length();
int flag=1;
if((lent-cnt)%2!=0)//t去掉‘a'后为s'+s',一定为偶数或者空
flag=0;
else
{
    for(int i=0;i<cnt+(lent-cnt)/2;i++)//找出s'
    {
    	if(t[i]!='a')
        s1+=t[i];
    }
    for(int i=0;i<cnt+(lent-cnt)/2;i++)//找出s
    {
        s+=t[i];
    }
    if(t!=(s+s1))
    flag=0;
}
if(flag)
{
    cout<<s;
}
else
cout<<":(";
return 0;
}

AK爷兼职计
Description

AK爷最近收到一份兼职,是去幼儿园看小朋友,AK爷认为看孩子这件事情很简单,但是事实并非如此。幼儿园里的孩子们喜欢数学,不仅九九乘法口诀倒背如流而且精通各种算法。某天,AK爷上完课,有一个调皮的孩子走过来说:“AK老师,我有一道数学题目不会,你能帮帮我吗?给你一个数字N,紧接着N个数字a[i],从到,每个​,让你将这些数字拼接起来,使其在所有的拼接组合中它是最大的一个。例如:N = 3 ,a[0] = 3,a[1] = 2,a[2] = 1,它有6种组合,在所有的组合中,321最大,输出321。”AK爷心想,这不很简单吗,于是他把这道题丢给了聪明的你,聪明如你,快来帮帮AK爷吧。

Input
第一行一个数字N代表数字个数,。

第二行N个数字,每个数的位数不超过10位,每个测试样例的数字位数和不超过​。

Output
输出只包含一个整数

数据范围:

0<N<=105

当我想明白不超过10位是什么意思,就在想到底要怎么排序,然后看了学长的代码,好简单。

#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int N=1e5+10;
bool cmp(string a,string b)
{
return a+b>b+a;
}
 int main()
 {
 string s[N];
 int n;
 cin>>n;
 for(int i=0;i<n;i++)
 cin>>s[i];
 sort(s,s+n,cmp);
 for(int i=0;i<n;i++)
 cout<<s[i];
 return 0;
}

Description

国际大学生程序设计竞赛(英文全称:International Collegiate Programming Contest(简称ICPC))是由国际计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过近40年的发展,ACM国际大学生程序设计竞赛已经发展成为全球最具影响力的大学生程序设计竞赛。了解了ACM/ICPC的历史,接下来就让我们做题吧。现在给你一个整数n,可以将其转化为二进制数,你现在可以删除这个二进制数中的任意位(例如10101,你可以删除第三位的1,变为1001),问你最后剩下的二进制数能不能被64整除,如果可以被整除输出“yes”,否则输出“no”

Input
输入只包含一个整数n(0<=n<=2^63 −1)。

Output
如果满足条件输出“yes”,否则输出“no”;(只需输出yes或no,不要输出其他无关信息)

数据范围:

0<=n<=2^63 - 1
Sample Input 1
1025
Sample Output 1
yes
Sample Input 2
4
Sample Output 2
no
Hint

在第一个测试样例中,1025的二进制为10000000001‬,我们可以删掉最低位的1,使其变为1000000000,能被64整除,所以输出"yes";在第二个测试样例中,4的二进制为100,无论我们怎么删,也不会被64整除,所以输出“no”;

能够任意删除1或者0,也就是说只要1后面有6个0就可以了。

#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int a[100];
long long n;
cin>>n;
int i=0;
while(n)
{
    //printf("%d ",n&1);
    if(n&1) a[i]=1,i++;
    else a[i]=0,i++;
    n=n>>1;
    
}
reverse(a,a+i);
int flag=0,cnt=0;
for(int j=0;j<i;j++)
{
    if(a[j]==1)
    {
        flag=1;
        continue;
    }
    if(flag)
    {
        if(a[j]==0)
        cnt++;
    }
}

if(flag&&cnt>=6)
printf("yes");
else
printf("no");
return 0;
}

树的扩充
Description

檀黎斗社长在开发神极限卡带的过程中出现了问题,他发现了图论意义上一棵有N个节点的树,但他觉得还不够好,打算动用神之才能增加若干条边,使得N个节点中任意两点都有直接相连的边,并满足新图的唯一极小连通子图仍然一开始的树。

社长知道这样有很多种增加策略,但为了公司经营,需要消耗尽量少,即新增的边权值和的最小值。

Input
第一行包含整数t,表示共有t组测试数据。

对于每组测试数据,第一行包含整数N。

接下来N-1行,每行三个整数X,Y,Z,表示X节点与Y节点之间存在一条边,长度为Z。

Output
每组数据输出一个整数,表示权值总和最小值。

每个结果占一行。

数据范围
1≤N≤6000

1≤Z≤100

Sample Input 1

2
3
1 2 2
1 3 3
4
1 2 3
2 3 4
3 4 5
Sample Output 1

4
17
Hint
注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。

以例二,把2,3都加入到1中,1,2,3组成1个集合,4是1个集合,把4加到1,2,3中,除了原树中3,4相连权值为5,1和4,2和4相连,权值应该比5大1。也就是(集合(1,2,3)点的个数*集合(4)点的个数-1)×(3,4相连的权值+1)。
Kruskal加边法。

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=6e3*2+10;
int f[N];
int s[N];
int n,m;
struct Edge
{
int u,v,w;
bool operator<(const Edge &W) const{
    return w<W.w;
}
}edges[N];
int find(int x)
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%d",&n);
    for(int i=0;i<n-1;i++)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        edges[i]={u,v,w};
    }
    sort(edges,edges+n-1);
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
        s[i]=1;//s数组用于确定集合中的点数
    }
    int res=0;
    for(int i=0;i<n-1;i++)
    {
        int a=edges[i].u,b=edges[i].v,w=edges[i].w;
        a=find(a);
        b=find(b);
        if(a!=b)
        {
            res+=(w+1)*(s[a]*s[b]-1);
            f[a]=b;
            s[b]+=s[a];
        }
    }
    printf("%d\n",res);
}
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值