钟长者P71解题报告

news/2024/12/5 0:22:29/

T1

【题目描述】

给你N个字符串,你每次可以选择其中一个字符串的一段前缀进行翻转,但是你必须保证这个前缀的长度是偶数。你可以进行无限次这样的操作,并且如果
两个字符串变得相同的时候,你就可以把这两个字符串都删除掉,问最后最少剩下多少个字符串?

【输出格式】
对于每组数据,一行一个整数代表答案。
【样例输入】
2
5
esprit
god
redotopc
odcpoter
dog
14
rats
live
stressed
to
act
as
star
desserts
of
evil
cat
sa
fo
ot

【样例输出】
3
0
【样例解释】
无。
【数据范围与规定】

对于40%的数据,字符串长度不超过8

对于100%的数据,1<=T<=11,字符串长度不超过50,1<=N<=50

 

#include <cstdio>
#include <cstring>
char s[51][51];
int t,n,ans,len[51];
bool vis[51][1001],del[51];inline void work(int x)
{len[x]=strlen(s[x]);--len[x];//长度若是单数,那么下面枚举到最后时会出现vis[负数]=true for(int i=0;i<len[x];i+=2)vis[x][s[x][i]-'a'+s[x][i+1]-'a']=true;++len[x];
}inline bool judge(int i,int j)
{for(int k=0;k<1001;++k)if(vis[i][k]!=vis[j][k])return false;
//    printf("\n%s %s\n",s[i],s[j]);if(len[i]&1)return s[i][len[i]-1]==s[j][len[j]-1];return true;
}inline void clear()
{ans=0;memset(vis,false,sizeof vis);memset(del,false,sizeof del);
}int main()
{freopen("kahuucino.in","r",stdin);freopen("kahuucino.out","w",stdout);scanf("%d",&t);while(t--){clear();scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%s",s[i]);for(int i=1;i<=n;++i)work(i);//处理每个字符串的情况 /*printf("\n");for(int i=1;i<=n;++i)printf("%d ",len[i]);printf("\n");
*/for(int l,i=1;i<=n;++i){if(del[i])continue;for(int j=i+1;j<=n;++j){if(del[j]||len[i]!=len[j])continue;if(judge(i,j)){
//                    printf("\n%d %d\n",i,j);del[j]=true;ans+=2;break;}}}printf("%d\n",n-ans);}fclose(stdin);fclose(stdout);return 0;
}
/*
5
esprit
god
redotopc
odcpoter
dog样例第一组数据解释: 
redotopc -> cpot oder -> topcod er -> do cpoter -> odcpoter
最后剩3个 以连续两个字符为一个单位 
*/
考试30分代码
/*
把字符串拆成有两个字母的组合
然后将这些组合按照字典序排起来,合到一起形成一个新的字符串
最后判断这个字符串有没有出现过
*/
#include <algorithm>
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <set>std::set<std::string> h;
std::string a[55];
int getMin(std::vector<std::string> words)
{int n=words.size(),ans=n;h.clear();for(int i=0;i<n;++i){int m=words[i].size();std::string s="";for (int j=0;j*2<m;++j){char x=words[i][j*2],y=words[i][j*2+1];if(x>y)std::swap(x,y);a[j]=x,a[j]+=y;}std::sort(a,a+m/2);for(int j=0;j*2<m;++j)s+=a[j];if(m&1)s+=words[i][m-1];if(h.find(s)==h.end())h.insert(s);else h.erase(s),ans-=2;}return ans;
}int main()
{freopen("kahuucino.in","r",stdin);freopen("kahuucino.out","w",stdout);int T,n,m;std::string s;std::vector<std::string> w;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);w.clear();for(int i=0;i<n;++i){std::cin>>s;w.push_back(s);}printf("%d\n",getMin(w));}fclose(stdin);fclose(stdout);return 0;
}
正解

 

T2

麻耶
【问题描述】
油库里是幻想乡特有的一种生物。每只油库里都有一个战斗力值和一个能量值。当两只油库里战斗时,总是战斗力值高的一位获胜。获胜者的战斗力值将变成(自己的原战斗力值-对手的战斗力值+对手的能量值)。败者将死去。若两者战斗力值一样,则同归于尽。
思考熊发现了很多油库里,他想知道通过互相战斗之后油库里中战斗力值+能量值最高的一个可能到达多少。你能帮他们求出来吗?

(假设除了考察的那只油库里之外,其他油库里之间不会发生战斗)

【输入格式】
第一行是一个整数N,代表当前有多少油库里。
接下来的N行, 每一行有两个整数u,v, 代表这只油库里的战斗力值和能量值。

【输出格式】
输出一个整数,代表油库里中战斗力值+能量值最高的一个能达到多少。

【样例输入】
2
1 2
2 1
【样例输出】
4
【样例解释】
无。

不是所有油库里都要打一遍!!!

本来自信满满能拿10分……………………

正解是贪心

题意描述不清……

以为是所有油库里都要打一遍

但是实际是可以随意选着搞,想和哪个打和哪个打……

 

#include <algorithm>
#include <complex>
#include <cstdio>
const int N=1e5+7;
#ifdef Win32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
struct node{int u,v;
}peo[N];
int n;
long long ans;
int read()
{int n=0,w=1;register char c=getchar();while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar();return n*w;
}
bool cmp(const node &a,const node &b)
{if(a.u==b.u)return a.v>b.v;return a.u<b.u;
}
inline long long max(long long x,long long y)
{return x>y?x:y;}
int main()
{freopen("zyougamaya.in","r",stdin);freopen("zyougamaya.out","w",stdout);n=read();for(int i=1;i<=n;++i){peo[i].u=read();peo[i].v=read();ans=max(ans,(long long)peo[i].u+peo[i].v);}std::sort(peo+1,peo+n+1,cmp);long long sum=0;for(int i=1;i<=n;++i){ans=max(ans,sum+peo[i].u+peo[i].v);if(peo[i].u<peo[i].v)sum+=peo[i].v-peo[i].u;}printf("%I64d",ans);//不能用define的LL,只能得10分
    fclose(stdin);fclose(stdout);return 0;
}
正解



T3

思路:大模拟

注意细节!!!!!

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
char cmd[20];
struct Node{int son[101],now,fa,type;
//儿子有哪些,现在到了第几个儿子,父亲是谁,是文件还是文件夹(1是文件,2是文件夹) std::string s;Node(){now=0,fa=0;}
}a[201];inline void del_file(int x)
{a[x].fa=0;a[x].type=0;a[x].s=' ';
}void del_directory(int x)
{a[x].fa=0;a[x].s=' ';a[x].type=0;for(int i=1;i<=a[x].now;++i){if(a[a[x].son[i]].type==1)del_file(a[x].son[i]);else    del_directory(a[x].son[i]);a[x].son[i]=0;}a[x].now=0;
}int main()
{freopen("nacumegu.in","r",stdin);freopen("nacumegu.out","w",stdout);int n,now=-1;//now:现在在哪个里面 scanf("%d",&n);for(int i=1;i<=n;++i){
//        printf("\nGG\n");scanf("%s",cmd);switch(cmd[0]){case 'c'://转换目录 std::cin>>a[i].s;if(a[i].s[0]=='.'){//向上一级 if(a[now].fa!=0)now=a[now].fa;else    printf("No parent directory!\n");}else{//向下一级 for(int j=1;j<=a[now].now;++j)if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2){now=a[now].son[j];goto S;}printf("No such directory!\n");}
//                --i,--n;//没必要 continue;case 't'://新建文件 
                std::cin>>a[i].s;for(int j=1;j<=a[now].now;++j)if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==1){//已经有了 printf("File already exists!\n");goto S;}a[now].son[++a[now].now]=i;a[i].now=0;a[i].fa=now;a[i].type=1;continue;case 'r'://删除 
            std::cin>>a[i].s;if(strlen(cmd)<3){//删除文件 for(int j=1;j<=a[now].now;++j)if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==1){//
                            del_file(a[now].son[j]);a[now].son[j]=0;goto S;}printf("No such file!\n");}else{//删除文件夹for(int j=1;j<=a[now].now;++j)if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2){//
                            del_directory(a[now].son[j]);a[now].son[j]=0;goto S;}printf("No such directory!\n");}goto S;case 'm'://新建文件夹 std::cin>>a[i].s;for(int j=1;j<=a[now].now;++j)if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2){//已经有了 printf("Directory already exists!\n");goto S;}a[now].son[++a[now].now]=i;a[i].now=0;a[i].fa=now;a[i].type=2;continue;case 'l'://输出目录下的文件及文件夹 for(int j=1;j<=a[now].now;++j){if(a[a[now].son[j]].s[0]==' ')continue;std::cout<<a[a[now].son[j]].s;if(a[a[now].son[j]].type==1)printf(" <F>\n");else    printf(" <D>\n");}}
S:        ;}fclose(stdin);fclose(stdout);return 0;
}
正解

 

转载于:https://www.cnblogs.com/kuaileyongheng/p/8689981.html


http://www.ppmy.cn/news/639756.html

相关文章

Java习题--P71第四题

public class Vehicle {int wheels;float weight;public Vehicle(int wheels, double d) {super();this.wheels wheels;this.weight (float) d;}void show() {System.out.print("车轮:"this.wheels);System.out.print(",车重:"this.weight);} }public cl…

JAVA系列05:30天Java核心技术P56~P71

P57 变量运算规则的两个特殊情况 1、整形变量默认int,赋值long型变量不加l,默认成int 浮点型变量默认成double&#xff0c;定义float不加f&#xff0c;默认成double&#xff0c;而要小&#xff08;float&#xff09;转大(double)&#xff0c;会出错 2、整形常量默认为int&am…

p71 内网安全-域横向网络传输应用层隧道技术

数据来源 必备知识点&#xff1a; 1、代理和隧道技术区别? 代理&#xff1a;只是解决网络的访问问题&#xff08;如&#xff1a;有些内网访问不到&#xff0c;可以用代理实现&#xff09; 隧道&#xff1a;隧道不仅是解决网络的通信问题&#xff0c;更大的作用是绕过过滤&…

C++基础入门---8.结构体【P64~P71】

C基础入门---8.结构体【P64~P71】 8. 结构体8.1 结构体的定义和使用8.2 结构体数组8.3 结构体指针8.4 结构体嵌套结构体8.5 结构体作函数参数8.6 结构体中const使用场景8.7 结构体案例18.8 结构体案例2 8. 结构体 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同…

面试宝典P71 例题9详解

本人在看这章的该习题时&#xff0c;也曾被搞糊涂过&#xff0c;其实刚开始还是不要看它的解释更好&#xff0c;多加一些打印语句&#xff0c;自然就知道各个变量的地址和对应的值了。 原题如下&#xff1a; struct S { int i; int* p; }; S s; int* p &s.i; p[0] 4; p…

JS笔记_P71数组字面量

P71数组字面量 创建一个数组使用字面量来创建数组使用构造函数创建数组数组中的元素可以是任意的数据类型1、可以是对象2、可以是一个函数3、数组中也可以放数组&#xff0c;称为二维数组 文章声明&#xff1a; 学习地址1&#xff1a;谷粒学院学习地址2&#xff1a;BILIBILI尚硅…

18.4.1 考试解题报告 P71

题目&#xff1a;https://files.cnblogs.com/files/lovewhy/problem.pdf 偷偷摘来dalao题面。 P71竞赛时间&#xff1a;???? 年?? 月?? 日??:??-??:?? 题目名称智乃 麻耶惠 名称 kahuucino zyougamayanacumegu 输入 kahuucino.in zyougamaya.innacumegu.in …

P71-前端基础项目开发-网页导航栏开发首页header头部左侧导航栏

P71-前端基础项目开发-网页导航栏开发首页header头部左侧导航栏 1.概述 在首页header部分现在还有一个左侧的导航栏没有开发&#xff0c;下面就来完成这个导航栏。 2.首页header头部左侧导航栏 2.1.左侧导航栏需求 2.2.创建左侧导航栏结构 左侧的导航栏实际上是全部商品分类的…