2017年3月26日 西安理工大学校赛
题目链接:http://xaut.openjudge.cn/xautcontestnew/ (官方标程也在里面)
A题:
题意: 给一个字符串,小写变大写 大写变小写 其他字符忽略后输出
做法: 库函数搞一搞也可以,利用 s[i] - 'A' + 'a' 变小写也可以(大写同理)
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int n ; 7 cin >> n ; 8 while( n--) 9 { 10 string s ; 11 cin >> s ; 12 for( int i = 0 ; i < s.size() ; i++) 13 { 14 if( isalpha(s[i]) ) 15 { 16 if( s[i] >= 'a' && s[i] <= 'z') 17 printf("%c",toupper(s[i]) ); 18 else 19 printf("%c",tolower(s[i])); 20 } 21 } 22 cout << endl ; 23 } 24 return 0 ; 25 26 }
B题:
题意:给一个小于1e1000的整数,判断奇偶。
做法: 字符串读入,判断最后一个字符即可。
代码:
#include<bits/stdc++.h> using namespace std ; int main() { int t ; cin >> t ; while(t--) { string s ; cin >> s ; if( ( s[s.size() - 1] - '0' ) % 2 == 1 ) cout << "Yes" << endl ; else cout << "No" << endl ; } return 0 ; }
C题:
题意: 一直第一个星期星期一是A sir ,第一个星期星期二是B sir 一共 六个人(F sir) ,给出 第s1个星期(1 - 10000 ) , 星期s2 , 求是谁。
做法: 字符串读入后算出第几天,用mod搞一下就可以。
代码:
#include<bits/stdc++.h> using namespace std; const string ss[] = { "F sir" , "A sir" , "B sir" , "C sir" , "D sir","E sir" } ; int week( string &s) { if( s == "Monday") return 1 ; else if ( s == "Tuesday") return 2 ; else if( s == "Wednesday" ) return 3 ; else if ( s == "Thursday" ) return 4 ; else if( s == "Friday" ) return 5 ; else if ( s == "Saturday" ) return 6 ; else if ( s == "Sunday" ) return 7; else { int a = 100 ; a = a / 0 ; return -1; } } int main() { int t ; cin >> t ; while(t--) { string s1,s2; cin >> s1 >> s2 ; int temp = 0 ; for( int i = 4 ; i < s1.size() ; i++) { temp = temp*10 + ( s1[i] - '0' ); } int days = ( temp - 1 ) * 7 + week(s2); cout << ss[days % 6 ] << endl ; } return 0 ; }
E题:
题意: 已知一件物品从pay买是x元,现金买是y元,最多只能从pay买k个物品,给出N个物品,全部买下来最少需要多少钱?
做法: 按从pay买比用现金买便宜的多少为关键字排序,排序后贪心取就可以(注意pay买可能比现金贵,所以要考虑k不一定会用尽)
代码:
#include<bits/stdc++.h> using namespace std ; struct bb { int dianshang ; int xianjin; int flag ; } a[1010]; bool cmp( struct bb a , struct bb b) { if( a.flag > b.flag) return true; else return false ; } int main() { int t ; cin >> t ; while(t--) { int n , k ; cin >> n >> k; for( int i = 1 ; i <= n ; i++) { cin >> a[i].dianshang >> a[i].xianjin ; a[i].flag = a[i].xianjin - a[i].dianshang ; } sort(a+1,a+n+1,cmp); int ans = 0 ; for( int i = 1 ; i <= n ; i++) { if( i <= k && a[i].flag >= 0 ) ans+=a[i].dianshang; else ans+=a[i].xianjin; } cout << ans << endl ; } return 0 ; }
F题:
题意: 给一个正整数(< 1000 ) , 找到一个离他最近的西数(即质数的平方) , 如果两边一样近,取较小的一个。
做法: 计算质数后查找就好。
代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1010; int prime[maxn]; bool isprime( int a ) { if( a== 1 || a == 0 ) return false ; if( a == 2 ) return true ; for( int i = 2 ; i <= sqrt(a) ; i++) if( a % i == 0 ) return false ; return true ; } int init() { int j = 1 ; for( int i = 1 ; i < maxn ; i++) { if( isprime(i)) prime[j++] = i ; } return (j-1) ; } int main() { int t ; cin >> t ; int cnt = init(); while(t--) { int n ; cin >> n ; int num = 0 ; for( int i = 1 ; i <= cnt ; i++) { if( prime[i]*prime[i] > n ) { num = i ; break ; } } int ans = 0 ; if( num == 1 ) ans = prime[1]*prime[1]; else if ( prime[num-1]*prime[num-1] == n) ans = n ; else if( abs( prime[num-1]*prime[num-1] - n ) > abs( prime[num]*prime[num] - n ) ) ans = prime[num]*prime[num]; else ans = prime[num-1]*prime[num-1]; cout << ans << endl ; } return 0 ; }
G题:
题意: 与上题相同,数据范围改为(1e10)。
做法: 用线性筛求质数即可(标程还用了二分查找,我没用也过了……)
代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5;; int prime[maxn]; bool issprime[maxn]; void initt() { issprime[0] = false , issprime[1] = false ; for( int i = 2 ; i < maxn ; i++ ) issprime[i] = true ; for( int i = 2 ; i < maxn ; i++) { int j = 2 ; if( issprime[i] ) { while(i*j < maxn ) { issprime[i*j] = false ; j++; } } } } bool isprime( int a ) { return issprime[a]; } int init() { int j = 1 ; for( int i = 1 ; i < maxn ; i++) { if( isprime(i)) prime[j++] = i ; } return (j-1) ; } int main() { int t ; cin >> t ; initt(); int cnt = init(); while(t--) { long long int n ; cin >> n ; long long int num = 0 ; for( int i = 1 ; i <= cnt ; i++) { if( prime[i]*prime[i] > n ) { num = i ; break ; } } int ans = 0 ; if( num == 1 ) ans = prime[1]*prime[1]; else if ( prime[num-1]*prime[num-1] == n) ans = n ; else if( abs( prime[num-1]*prime[num-1] - n ) > abs( prime[num]*prime[num] - n ) ) ans = prime[num]*prime[num]; else ans = prime[num-1]*prime[num-1]; cout << ans << endl ; } return 0 ; }
K题:
题意:设F(n)为Fibonacci数列,S(n) = C(n,1)F(1) + C(n,2)F(2) .... + C(n,n)F(n),T次询问,问S(n)能否被8整除,n < 1e10。
做法: 不会推……打标找规律搞得。
代码:
#include<bits/stdc++.h> using namespace std ; int main() { long long int n ; int t ; cin >> t ; while(t--) { cin >> n ; if( n % 3 == 0 ) cout << "Yes" << endl ; else cout << "No" << endl ; } return 0 ; }
最后感谢XAUT。
浙公网安备 33010602011771号