Codeforce Round 916(div3)
Codeforces Round 916(div3)
[Problem - A - Codeforces]:Problemsolving Log
A.题 直接看样例进行分析,发现每一次出现的字符代表着用了1分钟来看这道题,每道题都有固定的解题时间,只要达到了这个解题时间,就可以将这题解出来 , 答案就要加上1;同时要注意 将解决过的问题 要标记一下;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while(n --)
{
bool st[30];
memset(st , false , sizeof st);
int a[27] = {0}; //记得初始化;
int res = 0 ; //答案;
int time; //这个好像没什么用;
cin >> time;
string s;
cin >> s;
int len = s.size() - 1;
for(int i = 0 ; i <= len ; i ++)
{
a[s[i] - 'A'] ++;
if(a[s[i] - 'A'] >= (s[i] - 'A' + 1) && st[s[i] - 'A'] == false)
////s[i]-'A'+1代表解决题目所花费的时间
{
res ++;
st[s[i] - 'A'] = true;
}
}
cout << res << endl;
}
return 0;
}
[Problem - B - Codeforces]:Preparing for the Contest
B.题 有几次兴奋前面就直接 从小到大输出 ,输出到那个兴奋的数,后面的就要从大到小输出;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k;
cin >> k;
while(k --)
{
int n , num;
cin >> n >> num;
for(int i = 1 ; i <= num; i ++)
cout << i << " ";
for(int i = n; i >num ; i --)
cout << i << " ";
cout << endl;
}
return 0;
}
[Problem - C - Codeforces]:Quests
C.题贪心的思想,同是结合了前缀和,我感觉也有枚举的一些地方;
a[i]:代表着第一次完成前 i 个任务所获得的经验值;
b[i]:代表着重复完成第前 i 个任务的最大经验;(我们重复做的肯定是 那个经验值最大的那个)
res :经过枚举,如果完成第 i 个任务后 k 有剩余 那么我们就将重复做那个经验值最大的任务;
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int main()
{
int m;
cin >> m;
while(m --)
{
int n , k;
cin >> n >> k;
int a[N] , b[N];
for(int i = 1 ; i <= n ; i ++)
{
cin >> a[i];
a[i] += a[i - 1];
}
b[0] = 0;
for(int i = 1; i <= n ; i ++)
{
cin >> b[i];
b[i] = max(b[i] , b[i - 1]); //只保留最大的那个重复完成的值;
}
int res = -2e9;
//枚举完成到第几个任务,剩余的任务机会 都用来做重复的任务;
for(int i = 1 ; i <= n ; i ++)
{
res = max(res , a[i] + (k - i) * b[i]);
if(i == k) break; //注意有可能 k比n要小 完成k个任务后就要break;
}
cout << res << endl;
}
return 0;
}
[Problem - D - Codeforces]:Three Activities
D.暴力枚举的话可以做 不过需要注意写成函数 并且关闭同步流,但是我们可以优化,发现我们只需要每个项目的相对最大值,同时满足,天数各不相同,所以我们只需要存下来每个项目里面 ,经过排序后 三个最大值,在这三个最大值里面进行枚举,减少了枚举的量;
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
typedef pair<int , int> PII;
PII a[N] , b[N] , c[N];
int cmp(pair<int,int>a,pair<int,int>b)
{
if(a.first != b.first) return a.first > b.first;
else
return a.second < b.second;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
LL k;
cin >> k;
while(k --)
{
int n;
cin >> n;
vector<PII> a(n) , b(n) , c(n);
for(int i = 1; i <= n ; i ++)
{
int x;
cin >> x;
a.push_back({x , i});
}
for(int i = 1; i <= n ; i ++)
{
int x;
cin >> x;
b.push_back({x , i});
}
for(int i = 1; i <= n ; i ++)
{
int x;
cin >> x;
c.push_back({x , i});
}
sort(a.begin() , a.end() , cmp);
sort(b.begin() , b.end() , cmp);
sort(c.begin() , c.end() , cmp);
int res = 0;
//只取前三个人数
for(int i = 0 ; i < 3 ; i ++)
for(int j = 0 ; j < 3 ; j ++)
for(int k = 0; k < 3 ; k ++)
if(a[i].second != b[j].second && a[i].second != c[k].second && c[k].second != b[j].second)
res = max(res , a[i].first + b[j].first + c[k].first);
cout << res << endl;
}
return 0;
}