10.1綜合強化刷題 Day3 morning
競賽時間:????年??月??日??:??-??:??
題目名稱 |
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 和
【輸入格式】
第一行一個整數N代表單詞的個數。接下來N行每行一個單詞。
【輸出格式】
一行一個整數代表答案。
【樣例輸入】
3
AABAC
CBAAA
AAABB
【樣例輸出】
2
本來打的是個70分的暴力,結果後面兩個點A了,第8個點T了、、準是看本姑娘太可愛了、、
將近n^2枚舉,判斷一個字符是否與另一個字母相同,在比較的時候挨個字母的個數進行比較
#include<cstdio> #include<cstring> #include<cstdlib> #include考場90分代碼<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; }
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