[NOIP模拟][STL][冒泡排序][贪心][Bash模拟]

这篇博客主要介绍了NOIP模拟赛中的三道题目,涉及字符串翻转、油库里战斗力计算以及文件系统操作模拟。解题策略包括使用冒泡排序解决问题,Bash脚本模拟战斗过程,以及实现类似Linux命令的文件系统操作。

T1:题目大意:
智乃
【题目描述】
给你 ��个字符串 ,你每次 可以 选择 其中 一个 字符串 的一段 前缀 进行 翻转 ,但 是你必须 保证 这个 前缀 的长度 是偶数 。你可以 进行 无限次 这样 的操作 ,并且 如果 两个 字符串 变得 相同 的时候 ,你就 可以 把这两个 字符串 都删除 掉,问最后 最少 剩 下多少个 字符串 ?
【输入格式】
第一行个整数 ��代表数 据组。
对于每组数 据,第一行个整��代表字符串个数。
接下来 ��行每一个字符串。
【输出格式】
对于每组数据,一行个整代表答案 。
【样例输入】(难得手打)

【数据范围与规定】
对于 40%的数据, 字符串长度不超过 8。
对于 100%的数据 ,1≤��≤11,字符串长度不超过 50,1≤��≤50。

【解题思路】
但 是你必须 保证 这个 前缀 的长度 是偶数,,,偶数,做题的时候做着做着就忘了,,,,于是就直接前面偶数个排序,就gg了,,,,,,QAQ
,,你两个配对在一起,,再排序,,用map映射就很好写了,,,排序,手写冒泡排序。
这里strsub(i,n),从i位置去n个字符

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
#define INF 0x3f3f3f3f
#define clock CLOCKS_PER_SEC
#define cle(x) memset(x,0,sizeof(x))
#define maxcle(x) memset(x,127,sizeof(x))
#define mincle(x) memset(x,-1,sizeof(x))
#define cop(a,x) memcpy(x,a,sizeof(a))
#define FROP "kahuucino"
#define C(a,b) next_permutation(a,b)
#define LL long long
#define smin(x,tmp) x=min(x,tmp)
using namespace std;
int T;
string tmp;
map<string,int>mp;
map<string,int>::iterator it;
char pos[55];
int n;
void init()
{
    mp.clear();
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
        cin>>tmp;
        int len=tmp.size();
        for(int i =0; (i|1)<len;i+=2)if(tmp[i]>tmp[i|1])swap(tmp[i],tmp[i|1]);
        for(int i = 0; (i|1)<len;i+=2)
            for(int j = 0;j+3<len-i;j+=2)
                if(tmp.substr(j,2)>tmp.substr(j+2,2))
                    swap(tmp[j],tmp[j+2]),swap(tmp[j+1],tmp[j+3]);
        if(mp.find(tmp)!=mp.end())mp[tmp]++;
        else mp[tmp]=1;
    }
}
void work()
{
    int ans=0;
    for(it=mp.begin();it!=mp.end();it++)
    {
        int x=it->second;
        ans+=x/2*2;
    }
    printf("%d\n",n-ans);
}
int main()
{
    freopen(FROP".in","r",stdin);
    freopen(FROP".out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        init();
        work();
    }
    return 0;
}

,,这个代码我是借鉴大神的,,个人认为他的二进制学的好好。。。。

T2:麻耶
【问题描述】
油库里是幻想乡特有的一种生物。每只都个战斗力值和能量 油库里是幻想乡特有的一种生物。每只都个战斗力值和能量 值。当两只油库里战斗时,总是力高的一位获胜者将变 值。总是力高的一位获胜者将变 成(自己的原战斗力值 -对手的战斗力值 +对手的能量值 )。败者将死去若两战 斗力值一样,则同归于尽。
思考熊 发现了很多油库里,他想知道通过互相战斗之后你帮他们求出来吗?(假设除了考察那只 能量值最高的一个可到达多少。你帮他们求出来吗?(假设除了考察那只 能量值最高的一个可到达多少。你帮他们求出来吗?(假设除了考察那只 油库里之外,其他间不会发生战斗)
【输入格式】
第一行是个整数 ��,代表当前有多少油库里 。
接下来的 ��行,每一有两个整 行,每一有两个整 行,每一有两个整 行,每一有两个整 行,每一有两个整 数��,��,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量,代表这只油库里的战斗力值 和能量。
【输出格式】
输出一个整数,代表油库里中战斗力值 +能量值最高的一个达到多少 。
【样例输入】
2
1 2
2 1
【样例输出】
4
【样例解释】
无。
【数据规模与约定】
对于 100%的数据, 1≤��,��≤10^9。
2<=N<=100000

解题思路:
可以把他分成两种油库里,攻击型,攻击值大于能量值,能量型(也就相当于打了他可以获得能量),可以一个攻击型打完所有能量型(ans1),也可以一个战斗值最高的油库里打完剩余能量型(ans2),,打能量型是一定够的,因为你的战斗值是越打越多》。。。想出来这个算法的孩子真聪明
ans1,,打完所有能量型的所得值相同,就是在攻击型中找一个满足能打完所有能量型,而且能量型和攻击值值和最大的一个,,,即可得出ans1.
而一个满足能打完所有能量型,,即下文代码中的basic…..战斗值排序,再一个一个打,不够了再加.
注意打死是大于而不是等于。。

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
#define INF 0x3f3f3f3f
#define clock CLOCKS_PER_SEC
#define cle(x) memset(x,0,sizeof(x))
#define maxcle(x) memset(x,127,sizeof(x))
#define mincle(x) memset(x,-1,sizeof(x))
#define cop(a,x) memcpy(x,a,sizeof(a))
#define FROP "zyougamaya"
#define C(a,b) next_permutation(a,b)
#define LL long long
#define smin(x,tmp) x=min(x,tmp)
using namespace std;
const int N=100005;
struct ii
{
    int x,y;
    ii(int x=0,int y=0):x(x),y(y){ }
    bool operator <(const ii&a)const
    {
        return x<a.x;
    }
}good[N],bad[N];
int comp(const ii &a,const ii &b)
{
    return a.x+a.y>b.x+b.y;
}
int n,sg,sb;
LL basic,ans1,ans2;
int main()
{
    freopen(FROP".in","r",stdin);
    freopen(FROP".out","w",stdout);
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(x>=y)bad[++sb]=ii(x,y);
        else good[++sg]=ii(x,y);
    }
    sort(good+1,good+sg+1);
    basic=good[1].x+1;
    LL tmp=basic,sum1=0,sum2=0;
    for(int i = 1; i <= sg; i++){
        sum1+=good[i].x;
        sum2+=good[i].y;
        if(tmp>good[i].x)
        {
            int v=good[i].x-good[i].y;
            tmp-=v;
        }
        else{
            basic+=good[i].x-tmp+1;
            tmp=1+good[i].y;
        }
    }
    sort(bad+1,bad+sb+1,comp);
    for(int i = 1; i<= sb;i++)
        if(bad[i].x>=basic)
        {
            ans1=bad[i].x+bad[i].y-sum1+sum2;
            break;
        }
     ans2=good[sg].x+good[sg].y;
    for(int i =sg-1;i>=1;i--)
        ans2=ans2+good[i].y-good[i].x;
    printf(AUTO,max(ans1,ans2));
    return 0;
}

T3:惠
【问题描述】
现在你要实一个文件系统,支持以下操作
cd Directory_Name
如果当前路径下有名为 Directory_Name的文件夹,则进入该所对应 的文件夹,则进入该所对应 的路径, 否则输出“ No such directory!”。
cd ..
如果当前路径 存在父,则返回如果当前路径 存在父,则返回,否则输出“ 否则输出“ 否则输出“ No parent directory!”。
touch File_Name
如果当前目录下存在名为 File_Name的文件则输出 “File already exists!”, 否则创建这样一个文件。
rm File_Name
如果当前目录下存在名为 File_Name的文件则删除它 ,否则输出“ No such file!”。
mkdir Directory_Name
如果在当前路径下存名为 Directory_Name的文件夹,则输出 “Directory already exists!” ,否则创建这样一个文件夹(当前路径不变) 。
rmdir Directory_Name
如果在当前路径下存名为 Directory_Name的文件夹,则删除之 ,否则输 否则输 出“ No such directory!”。
ls
列出当前路径下所有的文件和夹,每一项占行按创建先后顺序给 出。 采用以下形式输 :
“Item_Name Type”
Type为(文件夹)或 (文件)
注意:同一路径下文件 与夹可以名,但文件夹与文件不能同名。
初始时当前路径处于根下,无父路径。
【输入格式】
第一行为 ��,表示有 ��个操作 。
接下来是 ��行,每输入为以上描述的操作之一。
【输出格式】
输出 答案 。
【样例输入】
3
mkdir standy
touch totalfrank
ls
【样例输出】
standy
totalfrank
【样例解释】
无。
【数据规模与约定】
对于 100%的数据 ,1≤��≤100,所有 文件 名字 长度 不超过 200且均为 小写 字母 。

解题思路:
就是模拟,,考试的时候QAQif条件语句写错了MM
注意输出顺寻,,用递归就好了

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
#define INF 0x3f3f3f3f
#define clock CLOCKS_PER_SEC
#define cle(x) memset(x,0,sizeof(x))
#define maxcle(x) memset(x,127,sizeof(x))
#define mincle(x) memset(x,-1,sizeof(x))
#define cop(a,x) memcpy(x,a,sizeof(a))
#define FROP "nacumegu"
#define C(a,b) next_permutation(a,b)
#define LL long long
#define smin(x,tmp) x=min(x,tmp)
using namespace std;
char ch[205];
const int N=105;
int haed[N],fa[N];
struct ii
{
    int to,ne;
    ii(int to=0,int ne=0):to(to),ne(ne){ }
}ed[N];
int etot,ptot,head[N];
map<string,int>::iterator it;
int path;
struct dd
{
    int wht,exit;
    string s;
}poi[N];
void ls(int x)
{
    if(x==0)return;
    ls(ed[x].ne);
    int tv=ed[x].to;
    if(!poi[tv].exit)return;
    cout<<poi[tv].s;
    char ch=poi[tv].wht?'D':'F';
    printf(" <%c>\n",ch);
}
void cd(int x,string s)
{
    for(int i =head[x]; i;i=ed[i].ne)
    {
        int tv=ed[i].to;
        if(poi[tv].s==s&&poi[tv].wht&&poi[tv].exit){path=tv;return;}
    }
    printf("No such directory!\n");
}
void cdd(int x)
{
    if(x){path=fa[x];return;}
    printf("No parent directory!\n");
}
void add(int x,string s,int wt)
{
    fa[++ptot]=x;
    ed[++etot]=ii(ptot,head[x]);
    head[x]=etot;
    poi[ptot].wht=wt,poi[ptot].exit=1;
    poi[ptot].s=s;
}
void touch(int x,string s)
{
    int i;
    for(i=head[x];i;i=ed[i].ne)
    {
        int tv=ed[i].to;
        if(!poi[tv].wht&&poi[tv].s==s&&poi[tv].exit){printf("File already exists!\n");return ;}
    }
    add(x,s,0);
}
void rm(int x,string s)
{
    int i;
    for(i =head[x];i;i=ed[i].ne)
    {
        int tv=ed[i].to;
        if(!poi[tv].wht&&poi[tv].s==s&&poi[tv].exit){poi[tv].exit=0;return;}
    }
    printf("No such file!\n");
}
void mkdir(int x,string s)
{
    int i;
    for(i =head[x];i;i=ed[i].ne)
    {
        int tv=ed[i].to;
        if(poi[tv].wht&&poi[tv].s==s&&poi[tv].exit){printf("Directory already exists!\n");return;}
    }
    add(x,s,1);
}
void rmdir(int x,string s)
{
    int i;
    for(i =head[x];i;i=ed[i].ne)
    {
        int tv=ed[i].to;
        if(poi[tv].wht&&poi[tv].s==s&&poi[tv].exit){poi[tv].exit=0;return;}
    }
    printf("No such directory!\n");
}
char s1[205],s2[205];
int main()
{
    freopen(FROP".in","r",stdin);
    freopen(FROP".out","w",stdout);
    int Q;
    scanf("%d",&Q);
    path=0;
    while(Q--)
    {
        cle(s1),cle(s2);
        scanf("%s",s1);
        char ch=s1[0];
            if(ch=='l'){ls(head[path]);}
            else if(ch=='c'){scanf("%s",s2);if(s2[0]!='.')cd(path,s2);else cdd(path);}
            else if(ch=='t'){scanf("%s",s2);touch(path,s2);}
            else if(ch=='r'){scanf("%s",s2);if(strlen(s1)==2)rm(path,s2);else rmdir(path,s2);}
            else if(ch=='m'){scanf("%s",s2);mkdir(path,s2);}
        }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值