1. 程式人生 > >10.1綜合強化刷題 Day3 morning

10.1綜合強化刷題 Day3 morning

break 枚舉 day3 close flag class ostream stdin blog

                        競賽時間:??????????:??-??:??

題目名稱

a

b

c

名稱

a

b

c

輸入

a.in

b.in

c.in

輸出

a.out

b.out

c.out

每個測試點時限

1s

1s

1s

內存限制

256MB

256MB

256MB

測試點數目

10

10

10

每個測試點分值

10

10

10

是否有部分分

題目類型

傳統

傳統

傳統

a

【問題描述】

你是能看到第一題的 friends 呢。

——hja

怎麽快速記單詞呢?也許把單詞分類再記單詞是個不錯的選擇。何大爺給出了一種分單詞的方法,何大爺認為兩個單詞是同一類的當這兩個單詞的各個字母的個數是一樣的,如 dog

god。現在何大爺給了你 N個單詞,問這裏總共有多少類單詞。

【輸入格式】

第一行一個整數N代表單詞的個數。接下來N行每行一個單詞。

【輸出格式】

一行一個整數代表答案。

【樣例輸入】

3

AABAC

CBAAA

AAABB

【樣例輸出】

2

技術分享

本來打的是個70分的暴力,結果後面兩個點A了,第8個點T了、、準是看本姑娘太可愛了、、

將近n^2枚舉,判斷一個字符是否與另一個字母相同,在比較的時候挨個字母的個數進行比較

技術分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include
<iostream> #include<algorithm> #define N 10010 using namespace std; bool flag; char ch[N][110]; int n,l[N],ans,sum[N][30],fa[N]; int find(int x) { if(fa[x]==x) return x; return fa[x]=find(fa[x]); } int read() { int x=0,f=1; char ch=getchar(); while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar(); return x*f; } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); n=read();ans=n; for(int i=1;i<=n;i++) cin>>ch[i],l[i]=strlen(ch[i]); // sort() for(int i=1;i<=n;i++) for(int j=0;j<l[i];j++) sum[i][ch[i][j]-A]++; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { flag=false; for(int k=0;k<26;k++) if(sum[i][k]!=sum[j][k]) {flag=true; break;} if(!flag) if(find(i)!=find(j)) fa[j]=i,ans--; } printf("%d",ans); return 0; }
考場90分代碼

AC代碼

將字符串轉換成數字進行比較(在轉換的時候我們要乘一個質數,乘質數重復的可能性很小),sort排序以後判斷當前數是否與他後面的數相同,如果不同ans++

技術分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10010
using namespace std;
char ch[110];
int n,l[N],ans,num[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++) 
    {
        cin>>ch,l[i]=strlen(ch);
        sort(ch,ch+l[i]);
        for(int j=0;j<l[i];j++)
         num[i]=num[i]*233+ch[j]-A+1;
    }
    sort(num+1,num+1+n);
    for(int i=1;i<n;i++)
     if(num[i]!=num[i+1]) ans++;
    printf("%d",ans+1);
    return 0;
}
AC代碼

b

【問題描述】

你是能看到第二題的 friends 呢。

——laekov

長度為n 的鐵絲,你可以將其分成若幹段,並把每段都折成一個三角形。你還需要保證三角形的邊長都是正整數並且三角形兩兩相似,問有多少種不同的分法。

【輸入格式】

一行一個整數n

【輸出格式】

一行一個整數代表答案對109 + 7取模之後的值。

【樣例輸入 1

6

【樣例輸出 1】

2

【樣例輸入 2】

9

【樣例輸出 2】

6

【樣例解釋 2】

(1,1,1), (2,2,2); (2,2,2), (1,1,1)算兩種方案。

技術分享

c

【問題描述】

你是能看到第三題的 friends 呢。

——aoao

在小學的時候,我們都學過正視圖和左視圖。現在何大爺用一些小方塊擺了一個圖形,並給出了你這個圖形的左視圖和正視圖。現在何大爺希望知道,在給定正視圖和左視圖的情況下,原來的立體圖形有多少種可能的情況?

【輸入格式】

第一行兩個整數N ,M ,代表在左視圖和正視圖中分別有多少列。

第二行N個整數,代表在左視圖中從左至右每一列的高度。

第三行M個整數,代表在正視圖中從左至有每一列的高度。

【輸出格式】

一行一個整數代表答案對109 + 9取模之後的值。

【樣例輸入 1】

2 2

1 1

1 1

【樣例輸出 1】

7

【樣例輸入 2】

4 5

5 2 4 1

5 2 4 0 1

【樣例輸出 2】

429287

技術分享

              技術分享

                      距 NOIp2017 還剩 28 天

   你可以做的事情還有很多,即使到最後一秒也不要放棄,因為不到結束的那一刻誰也不知道結果會怎樣。

10.1綜合強化刷題 Day3 morning