- 东明张展奕's blog
【蓝图杯】8月整理
- 2024-8-2 11:30:11 @
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 - 抛硬币
也很简单,就是算出运气值()结构体排序,但有可能会运气值相同,这时候给个特判就行了
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 来做,读入完要先排一下序,之后计算时要先将 因为题目里说:如果两个元素的差恰好是 的倍数,才算是合法取数方案,所以要将 之后就可以计算:
- 首先将 的第 累加到 中
- 之后把 给加 因为这前面进行 取余 () 了为了防止在弄到还没加 之前的 所以要加
之后输出 就可以啦
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
所以这道题读入的时候可以把他看成两个部分
- 是奇数部分
- 是偶数部分
我们把偶数部分的最大的两个数相加 和 奇数部分最大的两个数相加的和 相比较,看哪个大就输出那个
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. 模运算
这 个数 的和就是
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. 不整除
在