hihoCoder编程练习赛72
题目1 : 玩具设计师
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步。所有的玩具零件均在一块由N × M个单位块组成的设计板上切割获得。每个单位块有一个耐用指数aij。
由于玩具制作安全标准要求每个零件的面积至少大于等于S,小Ho想要知道设计板上能切割出满足标准的最大耐用指数的玩具零件为多少。
输入
输入共N+1行,第一行三个整数N,M,S表示设计板的大小以及安全标准中对玩具零件面积的最低要求
第二行到第N+1行每行M个整数表示各个单位块的耐用指数。
1 ≤ N, M ≤ 300, 1 ≤ S ≤ 90000, |aij| ≤ 104
输出
输出共一行,表示满足安全要求的最大耐用指数。
- 样例输入
-
3 3 3 -3 -4 2 4 1 -2 3 -2 3
- 样例输出
-
7
思路:枚举矩形左上角点(x,y)和右下角点(i,j),o(n^4)居然也能过
1 //2018-08-12 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int N = 350; 10 const int INF = 0x3f3f3f3f; 11 12 int M[N][N], n, m, s; 13 14 int main() 15 { 16 while(cin>>n>>m>>s){ 17 for(int i = 0; i < n; i++) 18 for(int j = 0; j < m; j++){ 19 cin>>M[i][j]; 20 } 21 for(int i = 1; i < n; i++) 22 for(int j = 0; j < m; j++) 23 M[i][j] += M[i-1][j]; 24 for(int j = 1; j < m; j++) 25 for(int i = 0; i < n; i++) 26 M[i][j] += M[i][j-1]; 27 int ans = -INF; 28 for(int i = 0; i < n; i++){ 29 for(int j = 0; j < m; j++){ 30 for(int x = 0; x <= i; x++){ 31 for(int y = 0; y <= j; y++){ 32 if((i-x+1)*(j-y+1) < s)break; 33 int tmp = M[i][j]; 34 if(x-1 >= 0)tmp -= M[x-1][j]; 35 if(y-1 >= 0)tmp -= M[i][y-1]; 36 if(y-1>=0 && x-1>=0)tmp += M[x-1][y-1]; 37 ans = max(ans, tmp); 38 } 39 } 40 } 41 } 42 cout<<ans<<endl; 43 } 44 45 return 0; 46 }
题目2 : 剪切字符串
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi有一个长度为N的字符串,这个字符串每个位置上的字符两两不同。现在小Hi可以进行一种剪切操作:
选择任意一段连续的K个字符,把这段子串剪下来,粘在串首或者串尾。例如ABCDE -> ADEBC、ABCDE -> BCADE或者ABCDE -> DEABC等。
小Hi想知道如果可以反复进行任意次剪切操作,他最多可能得到多少种不同的字符串。由于数目可能非常大,你只需要输出模P(P是质数)的余数即可。
输入
三个整数N, K和P。
1 ≤ K ≤ N ≤ 107, 1 ≤ P ≤ 109 P是质数
输出
一个整数代表答案。
- 样例输入
-
6 5 11
- 样例输出
-
6
思路:打表找规律,打表代码
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <set> 6 #include <queue> 7 8 using namespace std; 9 10 int main() 11 { 12 for(int n = 1; n <= 10; n++){ 13 for(int k = 1; k <= n; k++){ 14 string str(n, '.'); 15 queue<string> que; 16 set<string> st; 17 set<string>::iterator iter; 18 for(int i = 0; i < n; i++) 19 str[i] = 'a'+i; 20 que.push(str); 21 st.insert(str); 22 while(!que.empty()){ 23 string ss = que.front(); 24 que.pop(); 25 for(int i = 0; i+k < n; i++){ 26 string ss1(ss, i, k); 27 string ss2 = ""; 28 for(int j = 0; j < i; j++) 29 ss2.push_back(ss[j]); 30 for(int j = i+k; j < n; j++) 31 ss2.push_back(ss[j]); 32 string s1 = ss1+ss2; 33 iter = st.find(s1); 34 if(iter == st.end()){ 35 st.insert(s1); 36 que.push(s1); 37 } 38 string s2 = ss2+ss1; 39 iter = st.find(s2); 40 if(iter == st.end()){ 41 st.insert(s2); 42 que.push(s2); 43 } 44 } 45 } 46 cout<<n<<" "<<k<<" -> "<<st.size()<<endl; 47 } 48 } 49 50 return 0; 51 }
AC代码
1 //2018-08-12 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define ll long long 7 8 using namespace std; 9 10 int main(){ 11 ll n, k, p; 12 cin>>n>>k>>p; 13 ll num2 = 1LL; 14 for(int i = 0; i < n-2; i++) 15 num2 = (num2*(n-i))%p; 16 ll num1 = (num2*2)%p; 17 if(n==k){ 18 cout<<1<<endl; 19 }else if(k == n-1){ 20 cout<<n<<endl; 21 }else{ 22 if(k&1LL){ 23 cout<<num1<<endl; 24 }else cout<<num2<<endl; 25 } 26 return 0; 27 }