题目链接:http://codeforces.com/problemset/problem/557/A
题意:给出n和三个区间[l1,r1] , [l2,r2] , [l3,r3] 在三个区间中取三个数,使这三个数之和为n,若有多个解,取第一个区间最大的,第二个区间最大的,第三个区间最大的……
本来我觉得作为A题,想着三个循环剪枝 10^6 应该可以过。过不了……
于是进行计算。
做法:先确定 ans1 (尽可能大,又要保证ans2和ans3合法 ,所以取r1和 n - l2 - l3 的最小值。) ,同理,再再ans1确定的基础上确定ans2,然后计算ans3。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 int n,min1 , min2 , min3 , max1 ,max2,max3; 7 int a,b,c; 8 using namespace std ; 9 int main() 10 { 11 cin >> n ; 12 cin >> min1 >> max1 13 >> min2 >> max2 14 >> min3 >> max3; 15 a = min( max1, n - min2 - min3 ); 16 b = min( max2 ,n - a - min3 ); 17 c = min(max3 , n - a - b ) ; 18 cout << a << ‘ ‘ << b <<‘ ‘ << c << endl ; 19 return 0 ; 20 }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5540
题意: 给定两个矩阵,这两个矩阵能否通过旋转重合……
做法: 模拟,比较—再旋转—再比较……如果都不行就是IMPOSSIBLE,能重合就是POSSIBLE。
注意拿一维数组处理的话,读取顺序是 1 2 4 3 , 以及旋转问题。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 using namespace std ; 8 9 int main() 10 { 11 int a[5],b[5]; 12 int t ; 13 cin >> t ; 14 for( int cas = 1 ; cas <=t ; cas++) 15 { 16 memset(a,0,sizeof(a)); 17 memset(a,0,sizeof(b)); 18 cin >> a[1] >> a[2] >> a[4] >> a[3] ; // 注意读取顺序 19 cin >> b[1] >> b[2] >> b[4] >> b[3] ; 20 bool flag = false ; 21 for( int i = 1 ; i <= 4 ; i++) 22 { 23 if( a[1] == b[1] && a[2] == b[2] && a[3] == b[3] && a[4] == b[4] ) 24 flag = true ; 25 else 26 { //rotate 27 int temp ; 28 temp = a[1],a[1] = a[2],a[2] = a[3],a[3] = a[4],a[4] = temp; 29 } 30 } 31 printf("Case #%d: ",cas); 32 if( flag ) 33 cout <<"POSSIBLE" << endl ; 34 else 35 cout << "IMPOSSIBLE" << endl ; 36 } 37 return 0 ; 38 }
题目链接:http://acm.uestc.edu.cn/#/problem/show/121
题意: 给8个视角, 让你判断一个骰子 1 2 3 4 5 6 分别对应的是多少?
做法:对每一个面i,他对应的面就是和他同一视角的里面没有出现过的那个数。
比如样例:
1
1 2 3
1 3 4
1 4 5
1 5 2
6 3 2
6 4 3
6 5 4
6 2 5
和1在同一视角出现过的有 2 3 , 3 4 , 4 5 , 5 2
那么没出现过的6就是他的对面。
模拟做一下就好了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> using namespace std ; int a[8][3]; int main() { int t ; cin >> t ; bool flag[7]; while( t-- ) { bool flagg = false ; memset(a,0,sizeof(a)); for( int i = 0 ; i < 8 ; i++) cin >> a[i][0] >> a[i][1] >> a[i][2] ; for( int i = 1 ; i <= 6 ; i++) { for( int s = 0 ; s < 7 ; s++) flag[s] = true ; flag[i] = false ; for( int j = 0 ; j < 8 ; j++) { for( int k = 0 ; k < 3 ; k++) { if( a[j][k] == i ) { flag[a[j][(k+1)%3]]=false,flag[a[j][(k+2)%3]]=false; break ; } } } for( int s = 1 ; s <= 6 ; s++) { if( flag[s] ) { if(flagg) cout << ‘ ‘ << s ; else { cout <<s; flagg=true; } } } } cout << endl; } return 0 ; }
题目链接:http://codeforces.com/problemset/problem/122/A
题意: 只有4和7组成的数字是幸运数字,给一个n,问n能否被幸运数字整除。
做法: 数据量只有1000,手算出4和7组成的所有情况,暴力试探能否整除。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> using namespace std ; const int array[] ={4,7,44,47,74,444,447,474,477,744,747,774,777}; bool judge( int n ) { for( int i = 0 ; i < 12 ; i++) if( n % array[i] == 0 ) return true ; return false ; } int main() { int n ; cin >> n ; if( judge(n) ) cout << "YES" << endl ; else cout <<"NO"<<endl; return 0 ; }
题目链接:http://codeforces.com/problemset/problem/122/B
题意: 给一个字符串,问由哪个幸运数组组成的子串最多?最多的情况下按字典序排列。没有输出-1;
做法: 4和7肯定是他的最小子串,子串是最多的。只要数4和7的个数,并且注意一下按字典序就好。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstring> 7 using namespace std ; 8 int main() 9 { 10 string s ; 11 cin >> s ; 12 int count1=0,count2=0; 13 for( int i = 0 ; i < s.size() ; i++) 14 { 15 if(s[i] == ‘4‘ ) 16 count1++; 17 else if(s[i] ==‘7‘) 18 count2++; 19 } 20 if( count1 == 0 && count2 == 0 ) 21 cout <<"-1"<<endl; 22 else if( count1 >= count2 ) 23 cout << "4" << endl ; 24 else 25 cout << "7" << endl ; 26 return 0 ; 27 }
题目链接:http://codeforces.com/problemset/problem/123/A
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5572
这两道题太难了不适合我这种蒟蒻。
我还是去做AOAPC吧……
原文:http://www.cnblogs.com/xiekeyi98/p/6307367.html