鍾長者P71解題報告

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;
}
正解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章