2020.06.09 习题训练5

题目:Sum of Odd Integers

题目链接:https://vjudge.net/problem/CodeForces-1327A

思路: 

问 n 能否分成 k 个不相同奇数的和,这里肯定要想到当 n 和 k 一奇一偶时,肯定不行,然后再考虑 k 过大时的情况,通过分析几个例子,得出 k*k > n时也是不成立的。(注意题目数据)

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)

int main()
{
    int t;
    cin >> t;
    while(t--){
        ll n,m;
        cin >> n >> m;
        if(n%2 != m%2){
            cout << "NO" << endl;
        }
        else if(m*m <= n)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

题目:Princesses and Princes

题目链接:https://vjudge.net/problem/CodeForces-1327B

思路: 

对于每组数据,给出n代表 n 个国家,下面 n 行,每一行给出一个 k ,和 k个选择。主要是记录配对情况,对于每组一旦可配对,便用map标记记录,并跳出进行下一个国家的配对。中途若无可配对的国家,可以先记录一下。到后面再从map中寻找有无可配对的王子。最后根据情况输出。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
map<int,int>ma;
int a[maxn];
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n,sign = 0,num = 0;
        cin >> n;
        for(int j = 1;j <= n;j++){
            int m,findnum = 0;
            cin >> m;
            for1(i,m){
                cin >> a[i];
            }

            for1(i,m){
                if(ma[a[i]] == 0 && findnum == 0){
                    ma[a[i]] = 1;
                    findnum = 1;
                }
                if(findnum)
                    break;
            }
            if(findnum == 0)
                sign = j;
        }
        for(int i = 1;i <= n;i++){
            if(ma[i] == 0){
                num = i;
                break;
            }
        }
        if(sign){
            cout << "IMPROVE" << endl;
            cout << sign << " " << num << endl;

        }
        else
            cout << "OPTIMAL" << endl;
        ma.clear();

    }
    return 0;
}

题目:EhAb AnD gCd

题目链接:https://vjudge.net/problem/CodeForces-1325A

思路:

给出 x ,找出符合 GCD(a,bLCM(a,bx 的一组a,b 情况。其实只要想起利用 GCD(1,m) = 1,  LCM(1,m)  = m ,就可以得到答案为 1,x-1.

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)

int main()
{
    int t;
    cin >> t;
    while(t--){
        ll x;
        cin >> x;
        cout << 1 << " " << x-1 << endl;
    }
    return 0;
}

题目:CopyCopyCopyCopyCopy

题目链接:https://vjudge.net/problem/CodeForces-1325B

思路:

这个题就是问这 n 个数有多少个不相同的数。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
set<int> s;
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        for0(i,n){
            int x;
            cin >> x;
            s.insert(x);
        }
        set<int> :: iterator it;
      
        cout << s.size() << endl;

        s.clear();
    }
    return 0;
}

题目:Yet Another Tetris Problem

题目链接:https://vjudge.net/problem/CodeForces-1324A

思路:

给出n个位置的高度,因为可以通过放高度为2的砖块消除,所以相邻差为奇数则可以,所以便是找是否有相邻奇偶性质不同则不符合条件。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
set<int> s;
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n,sign = 1,num;
        cin >> n;
        for(int i = 1;i <= n;i++){
            int x;
            cin >> x;
            if(i == 1)
                num = x%2;
            else if(num == x%2)
                continue;
            else{
                sign = 0;

            }
        }
        if(sign)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

题目:Yet Another Palindrome Problem

题目链接:https://vjudge.net/problem/CodeForces-1324B

思路:

通过删减,问是否有一个长度至少为3的回文串。可以想到两个相同的数放两边长度以及是2了,那么只要两个相同数之间还有数,那么一定可以构成。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
map<int,int> ma;
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n,sign = 0;
        cin >> n;
        for1(i,n){
            int x;
            cin >> x;
            if(ma[x] == 0)
                ma[x] = i;
            else{
                if(i - ma[x] > 1)
                    sign = 1;
            }
        }

        if(sign)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;

        ma.clear();
    }
    return 0;
}

题目:Frog Jumps

题目链接:https://vjudge.net/problem/CodeForces-1324C

思路:

可以默认起点和终点都是R ,所以只要就可以看出,只要找两个相近的R之间的最大距离,便可得到答案。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
map<int,int> ma;
int main()
{
    int t;
    string s1 = "R";
    cin >> t;
    while(t--){
       string s;
       int num = 0,sum = 0;
       cin >> s;
       s = s1 + s;
       s = s + s1;
       for(int i = 0;i < s.length();i++){
            if(s[i] == 'L'){
                sum++;
            }
            else{
                num = max(num,sum);
                sum = 0;
            }

       }
       cout << num+1 << endl;
    }
    return 0;
}

 

posted @ 2020-06-12 20:27  emhhbw==  阅读(141)  评论(0)    收藏  举报