A. Middle of the Contest
思路:签到题,不多说。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;
int main() {
int a,b,c,d;
scanf("%d:%d ",&a,&b);
scanf("%d:%d",&c,&d);
int h=c-a;
int m=d-b;
if(h%2!=0){
m+=60;
}
m/=2;
if(b+m>=60){
m-=60;
h++;
}
h/=2;
printf("%02d:%02d",a+h,b+m);
return 0;
}
B. Preparation for International Women's Day
思路:统计余数。余数相加等于k或者余数是0的符合条件。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;
ll n, k, a[120], ans;
int main() {
cin >> n >> k;
for(ll i = 0, s; i < n; i++) {
cin >> s;
a[s % k]++;
}
ans += (a[0] / 2);
if(k % 2 == 1)
for(ll i = 1; i <= k / 2; i++) {
ll minn = INF;
minn = min(minn, a[i]);
minn = min(minn, a[k - i]);
ans += minn;
} else {
for(ll i = 1; i < k / 2; i++) {
ll minn = INF;
minn = min(minn, a[i]);
minn = min(minn, a[k - i]);
ans += minn;
}
ans += a[k / 2] / 2;
}
cout << ans * 2;
return 0;
}
C. Balanced Team
思路:简单题,记得优化。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;
ll n, k, a[200100], ans;
int main() {
cin >> n;
for(ll i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
for(ll zuo = 1; zuo < n; zuo++) {
for(ll you = zuo + ans; you <= n; you++) {
if(a[you] - a[zuo] <= 5) {
ans = max(ans, you - zuo);
} else
break;
}
}
cout << ans + 1;
return 0;
}
D Zero Quantity Maximization
思路:map来统计个数,a和b相除一样的说明是可以用一个d来除,记得用long double。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
const int MAX = 2e5 + 10;
int n, ans;
long double a[MAX], b[MAX], s;
map<long double, int>mp;
int main() {IOS;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
for(int i = 0; i < n; i++) {
cin >> s;
if(a[i] != 0 && s != 0)
mp[a[i] / s]++;
if(s == 0 && a[i] != 0)
mp[0]++;
if(s == 0 && a[i] == 0)
ans++;
}
int maxx = 0;
for(auto &s : mp) {
maxx = max(maxx, s.second);
}
cout << maxx + ans;
return 0;
}
E:K Balanced Teams
思路:动态规划,f[i][j]表示前i个人分为j组共可以选多少人最多。
对于f[i][j]必须继承上一次的最大人数。
然后用尺取法选择当前区段小于5的个数。
f[i][k]=max(f[i][k],f[j-1][k-1]+i-j+1)转移方程,i是第i个人的位置,k是第k组,j是区间扩展的最左位置。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define maxn 100001
using namespace std;
int n, m, arr[maxn], f[5050][5050];
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> arr[i];
}
sort(arr + 1, arr + n + 1);
for(int i = 1, j = 1; i <= n; i++) {
for(int k = 1; k <= m; k++)//先设不选第i个,继承上一次的
f[i][k] = f[i - 1][k];
while(arr[j] + 5 < arr[i])//选择区间
j++;
for(int k = 1; k <= m; k++)//比较选j-1到i的区间的人多还是不选人多。
f[i][k] = max(f[i][k], f[j - 1][k - 1] + i - j + 1);
}
cout << f[n][m];
return 0;
}
F1 - Spanning Tree with Maximum Degree
思路:最大度数最大,那用vector存边,找有最大度数的。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
int n, m, i, x, y, v, d, mv, c[222000];
vector<int> g[222000];
queue<int> q;
int main() {
for(cin >> n >> m; i < m; i++)
cin >> x >> y, g[x].push_back(y), g[y].push_back(x);
for(i = 1; i <= n; i++)
d < g[i].size() ? d = g[i].size(), mv = i : 0;
q.push(mv), c[mv] = 1;
while(!q.empty()) {
v = q.front();
q.pop();
for(auto e : g[v]) {
if(!c[e]) {
cout << v << " " << e << "\n";
q.push(e), c[e] = 1;
}
}
}
}
F2 - Spanning Tree with One Fixed Degree