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 }
A

 

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 ;
}
B

 

 

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 ;
}
C

 

 

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 ;
}
E

 

 

 

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 ;
}
F

 

 

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 ;
}
G

 

 

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 ;
}
K

 

 

最后感谢XAUT。

 

posted on 2017-03-27 15:42  Dark猫  阅读(332)  评论(0)    收藏  举报

导航