A - 排列

A十分简单,只需用一个函数(全排:prev_permutation(开始值, 结束值))

code:

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

#define TRACE 1
#define tcout TRACE && cout

#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define int long long

const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 

const int N = 1e6 + 10, M = 2e6 + 10; 

int a[N];

signed main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	prev_permutation(a + 1, a + 1 + n);
	for(int i = 1; i <= n; i ++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

B - 抛硬币

也很简单,就是算出运气值(aiai+bi\frac{a_i}{a_i + b_i})结构体排序,但有可能会运气值相同,这时候给个特判就行了

code:

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

#define TRACE 1

#define tcout TRACE && cout

#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define int long long

const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 

const int N = 1e6 + 10, M = 2e6 + 10; 

struct st
{
	int idx;
	long double v;
}


bool cmp(struct st a, struct st b)
{
	if(a.v == b.v)
	{
		return a.idx < b.idx;
	}
	return a.v > b.v;
}

st sum[N];

signed main()
{
	int n;
	cin >> n;

	for (int i = 1; i <= n; i ++)
	{
		s[i].idx = i;
		int a, b;
		cin >> a >> b;

		sum[i].v = 1.0 * a / (a+b);
	}

	sort(sum + 1, s + n + 1, cmp);

	for(int i = 1; i <= n; i ++)
	{
		cout << sum[i].idx << " ";
	}
	return 0;
}

D. 二元组

这个题可以用 map 来做,读入完要先排一下序,之后计算时要先将 ai mod 200a_i \ mod \ 200 因为题目里说:如果两个元素的差恰好是 200200 的倍数,才算是合法取数方案,所以要将 ai mod 200a_i \ mod \ 200 之后就可以计算:

  • 首先将 mpmp 的第 aia_i 累加到 sumsum
  • 之后把 mpaimp_{a_i} 给加 11 因为这前面进行 取余 (modmod) 了为了防止在弄到还没加 11 之前的 mpmp 所以要加 11

之后输出 sumsum 就可以啦

code:

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

#define TRACE 1

#define tcout TRACE && cout

#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define int long long

const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 

const int N = 1e6 + 10, M = 2e6 + 10; 

int a[N];

map <int, int> mp;

signed main()
{
	int n;
	cin >> n;

	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}

	sort(a + 1,  a + n + 1);

	int sum = 0;
	for(int i = 1; i <= n; i ++)
	{
		a[i] %= 200;
	
		sum += mp[a[i]];
	
		mp[a[i]] ++;
	}

	cout << sum;

	return 0;
}

E - 新新的疑惑

偶数 + 偶数 = 偶数

2 + 6 = 8

奇数 + 奇数 = 偶数

1 + 1 = 2

所以这道题读入的时候可以把他看成两个部分

  1. 是奇数部分
  2. 是偶数部分

我们把偶数部分的最大的两个数相加 和 奇数部分最大的两个数相加的和 相比较,看哪个大就输出那个

code:

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define TRACE 1
#define tcout TRACE && cout
#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define ALL(a) (a).begin(),(a).end()
#define FOR(w, a, n) for(int w=(a);w<(n);++w)
#define RFOR(w, a, n) for(int w=(n)-1;w>=(a);--w)
#define REP(w, n) for(int w=0;w<int(n);++w)
#define RREP(w, n) for(int w=int(n)-1;w>=0;--w)
const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 
const int N = 1e6 + 10, M = 2e6 + 10; 
int n;
int a[N],b[N];
int ans;
int i,j;
signed main()
{
	cin>>n;
	for(i=0,j=0;i+j<n;)
	{
		int c;
		cin>>c;
		if(c %2==0)
		{
			a[i]=c;
			i++;
		}
		else
		{
			b[j]=c;
			j++;
		}
	}
    sort(a,a+n);
	sort(b,b+n);
    if(i==1 and j==1) cout<<-1;
    else if(i <= 1) 
		cout<<b[n - 1] + b[n - 2];
	else if(j <= 1) 
		cout<<a[n - 1] + a[n - 2];
    else 
		cout<<max(a[n-1]+a[n-2],b[n-1]+b[n-2]);
	return 0;
}

F - 大明 的等式

暴力模拟即可

code:


#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

#define TRACE 1

#define tcout TRACE && cout

#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define int long long

const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 

const int N = 1e6 + 10, M = 2e6 + 10; 

signed main()
{
	int n;
    cin >> n;
    int cnt = 0;
    for(int i = 1; i<=n;i ++)
    {
        for(int j = 1; j < n; j++)
        {
            if(i*j >= n){
                break;
            }
            cnt ++;
        }
    }
	return 0;
}

J - 贝壳的匹配

同样,模拟即可

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define TRACE 1
#define tcout TRACE && cout
#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define ALL(a) (a).begin(),(a).end()
#define FOR(w, a, n) for(int w=(a);w<(n);++w)
#define RFOR(w, a, n) for(int w=(n)-1;w>=(a);--w)
#define REP(w, n) for(int w=0;w<int(n);++w)
#define RREP(w, n) for(int w=int(n)-1;w>=0;--w)
const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 
const int N = 1e6 + 10, M = 2e6 + 10; 
signed main(void)
{
	int n;
    cin >> n;
    int a[n];
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
    }
    sort(a,a+n);
    int ans=0;
    for(int i=1;i<n;i++)
    {
        if(a[i-1]==a[i])
        {
            ans++;
            i++;
        }
    }
    cout << ans;
    return 0;
}

L. 模运算

nn 个数 1-1 的和就是 answeranswer

code:

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define TRACE 1
#define tcout TRACE && cout
#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define ALL(a) (a).begin(),(a).end()
#define FOR(w, a, n) for(int w=(a);w<(n);++w)
#define RFOR(w, a, n) for(int w=(n)-1;w>=(a);--w)
#define REP(w, n) for(int w=0;w<int(n);++w)
#define RREP(w, n) for(int w=int(n)-1;w>=0;--w)
const int P = 998244353; 
const int Base = 3221225477;
const int INF = 0x3f3f3f3f3f3f3f3f; 
const int N = 1e6 + 10, M = 2e6 + 10; 
signed main()
{
    int n;
    cin>>n;
    int sum = 0;
    while(n --)
    {
        int x;
        cin >>x;
        sum+=x-1;
    }
    cout << sum;
	return 0;
}

M. 不整除