A
题意:给出一个n 求 a*b = n 且a-b的绝对值最小
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <utility>
using namespace std;
typedef long long ll;
const int qq = 1e5 + 10;
ll num[qq];
int main(){
ll n; cin >> n;
int a, b;
bool f = false;
for(int i = 1; i <= n; ++i){
if(n%i == 0){
if(!f) a = i, b = n/i, f = true;
else{
if(abs(i - n/i) < abs(a-b)){
a = i, b = n/i;
}
}
}
}
if(a >b ) swap(a, b);
cout << a << " " << b << endl;
return 0;
}
B
题意:给出一个字符串字符串, A C T G 在字符串数目中的数目要相等, ?可以变成其中任意一个, 求是否能变化后能满足条件
思路:统计一下就行
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <utility>
using namespace std;
typedef long long ll;
const int qq = 1e5 + 10;
string str;
int num[qq];
int main(){
ll n; cin >> n;
cin >> str;
int maxn = 0;
if(n%4 != 0){
cout << "===" << endl;
return 0;
}
int c = 0;
for(int i = 0; i < (int)str.size(); ++i){
if(str[i] == '?'){
c++;
continue;
}
num[str[i]]++;
maxn = max(maxn, num[str[i]]);
}
int sum = 0;
sum = (maxn - num['A'])+(maxn - num['C'])+(maxn - num['G'])+(maxn - num['T']);
if(c - sum >= 0 && (c-sum)%4 == 0){
int A = maxn - num['A'] + (c-sum)/4;
int T = maxn - num['T'] + (c-sum)/4;
int G = maxn - num['G'] + (c-sum)/4;
int C = maxn - num['C'] + (c-sum)/4;
for(int i = 0; i < (int)str.size(); ++i)
if(str[i] == '?'){
if(A) str[i]='A', A--;
else if(T) str[i]='T', T--;
else if(G) str[i]='G', G--;
else if(C) str[i]='C', C--;
}
cout << str << endl;
}else cout << "===" << endl;
return 0;
}
C
题意:有n个服务器, q个任务 第i个任务在 ti 时间到来, 需要ki个服务器处理这个任务, 任务花费时间 di, 任务处理条件是当任务到来时有足够的服务器就处理, 没有就忽视这个任务
问最后每个任务的情况
思路:瞎搞搞就行了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <utility>
using namespace std;
typedef long long ll;
const int qq = 1e6 + 4000;
struct Task{
ll s, c, t;
int id;
ll sum;
}task[qq];
int vis[qq];
int to[qq];
int num[110];
vector<int> v[qq];
int cmp(Task &a, Task &b){
return a.id < b.id;
}
int main(){
ll n, q; cin >> n >> q;
for(int i = 0; i < q; ++i) cin >> task[i].s >> task[i].c >> task[i].t;
for(int i = 0; i < q; ++i) task[i].id = i;
memset(vis, 0, sizeof(vis));
memset(num, 0, sizeof(num));
memset(to, -1, sizeof(to));
int count = 0;
for(int i = 0; i < q; ++i)
to[task[i].s] = count++;
ll p = n;
for(int i = 1; i <= 1e6; ++i){
if(v[i].size()!=0){
for(int j = 0; j < (int)v[i].size(); ++j)
num[v[i][j]] = 0;
p += v[i].size();
}
if(to[i] >= 0){
if(p >= task[to[i]].c){
p -= task[to[i]].c;
int res = 0;
int k = task[to[i]].c;
for(int j = 1; j <= n && k; ++j){
if(!num[j]){
num[j] = 1;
res += j;
v[i+task[to[i]].t].push_back(j);
k--;
}
}
task[to[i]].sum = res;
}else task[to[i]].sum = -1;
}
}
sort(task, task+q, cmp);
for(int i = 0; i < q; ++i)
cout << task[i].sum << endl;
return 0;
}