题目一#include iostream #include map using namespace std; /* int 2*10^9 long long 2*10^18 2^30没有超过long long范围 若超过最大long long范围则考虑用高精度 */ const int N2e510; long long a[N]; maplong long,long long m;//统计数值出现次数 int main() { int n; long long c; cinnc; long long ans0; for(int i1;in;i) { cina[i]; m[a[i]]; //统计可能的B数值出现次数 a[i]-c; //执行A-C } for(int i1;in;i)//匹配A-CB的次数 { ansm[a[i]]; } coutans; return 0; }题目二#include iostream #include map using namespace std; //一个个枚举用双层循环会超时 //根据键知道值不用循环就可以直接获得 mapint,int ma; int main() { int n; cinn; int a; for(int i1;in;i) { cina; ma[a]i;//i位置的瓶子个数i位置 } int q; cinq; int m; for(int i1;iq;i) { cinm; coutma[m]endl; } return 0; }#include iostream #include cstring #include algorithm #include cmath using namespace std; //二分的写法 int cnt; typedef struct data { int num; int pos; }d; //变量类型 相当于int d a[100010]; //变量名 bool cmp(d x,d y) { return x.numy.num; //告诉sort函数结构体升序排列 } bool fun(int l,int r,int A) { if(lr) return false; long long mid(lr)/2; if(a[mid].numA) { cnta[mid].pos; return true; } if(a[mid].numA) return fun(l,mid-1,A); else if(a[mid].numA) return fun(mid1,r,A); } int main() { int n; cinn; int b; for(int i1;in;i) { cinb; a[i].numb; a[i].posi; } sort(a1,a1n,cmp); //二分的前提是数组必须有序 int q; cinq; for(int i1;iq;i) { int m; cinm; if(fun(1,n,m)) { coutcntendl; } else cout0endl; } return 0; }题目三#include iostream #include map #include string using namespace std; mapstring,long long m; int main() { int q; cinq; int i0; while(q--) { int op; string name; long long score; cinop; if(op1) { cinnamescore; m[name]score;//如果有则会覆盖之前的 //没有的话会增加一个新的 coutOKendl; } else if(op2) { cinname; //判断这个键是否存在 if(m.count(name)) coutm[name]endl; else coutNot foundendl; } else if(op3) { cinname; if(m.count(name)) { m.erase(name); //删除键值 coutDeleted successfullyendl; } else coutNot foundendl; } else if(op4) { //获取大小 coutm.size()endl; } } return 0; }题目四#include iostream #include set //有序去重 using namespace std; setint a; int main() { int m; cinm; int op,l; while(m--) { cinopl; if(op1) { if(a.count(l)) { coutAlready Existendl; } else { a.insert(l); } } else if(op2) { if(a.empty()) { coutEmptyendl; continue; } auto ita.lower_bound(l); //找第一个 ≥l的元素迭代器 int del_len; //所有元素都比l小 if(ita.end())//返回指向 “最后一个元素下一位” 的迭代器 { del_len*a.rbegin(); a.erase(del_len); } //所有元素都比l大 else if(ita.begin())//返回指向第一个元素的迭代器 { del_len*a.begin(); a.erase(del_len); } else { int pre*prev(it);//l的前驱迭代器 int net*it;//l的后继或者它本身 if(l-prenet-l) { del_lenpre; a.erase(pre); } else { del_lennet; a.erase(net); } } coutdel_lenendl; } } return 0; }题目五#include iostream using namespace std; /* 枚举可能的结果 只有ABABAB的AB循环 或者BABABA的BA循环 所以s的最终情况只有这两种只要把s变成这两种形式的操作次数取最小值即可 s变成ABABAB 比较s跟ABABAB有几个不同也就是需要交换不同的字符数/2次即可 */ string a,b,s; int n; void fun() { for(int i1;i2*n;i) { if(i%2!0) { aA; bB; } else { aB; bA; } } } int calc() { int ans0,cnt0; for(int i0;i2*n;i) { if(a[i]!s[i]) { ans; } else if(b[i]!s[i]) { cnt; } } return min(ans,cnt)/2; } int main() { int t; cint; while(t--) { int net; cinns; fun();//创造两种形式的字符串 netcalc(); coutnetendl; } return 0; }
每日一题(3.18)
题目一#include iostream #include map using namespace std; /* int 2*10^9 long long 2*10^18 2^30没有超过long long范围 若超过最大long long范围则考虑用高精度 */ const int N2e510; long long a[N]; maplong long,long long m;//统计数值出现次数 int main() { int n; long long c; cinnc; long long ans0; for(int i1;in;i) { cina[i]; m[a[i]]; //统计可能的B数值出现次数 a[i]-c; //执行A-C } for(int i1;in;i)//匹配A-CB的次数 { ansm[a[i]]; } coutans; return 0; }题目二#include iostream #include map using namespace std; //一个个枚举用双层循环会超时 //根据键知道值不用循环就可以直接获得 mapint,int ma; int main() { int n; cinn; int a; for(int i1;in;i) { cina; ma[a]i;//i位置的瓶子个数i位置 } int q; cinq; int m; for(int i1;iq;i) { cinm; coutma[m]endl; } return 0; }#include iostream #include cstring #include algorithm #include cmath using namespace std; //二分的写法 int cnt; typedef struct data { int num; int pos; }d; //变量类型 相当于int d a[100010]; //变量名 bool cmp(d x,d y) { return x.numy.num; //告诉sort函数结构体升序排列 } bool fun(int l,int r,int A) { if(lr) return false; long long mid(lr)/2; if(a[mid].numA) { cnta[mid].pos; return true; } if(a[mid].numA) return fun(l,mid-1,A); else if(a[mid].numA) return fun(mid1,r,A); } int main() { int n; cinn; int b; for(int i1;in;i) { cinb; a[i].numb; a[i].posi; } sort(a1,a1n,cmp); //二分的前提是数组必须有序 int q; cinq; for(int i1;iq;i) { int m; cinm; if(fun(1,n,m)) { coutcntendl; } else cout0endl; } return 0; }题目三#include iostream #include map #include string using namespace std; mapstring,long long m; int main() { int q; cinq; int i0; while(q--) { int op; string name; long long score; cinop; if(op1) { cinnamescore; m[name]score;//如果有则会覆盖之前的 //没有的话会增加一个新的 coutOKendl; } else if(op2) { cinname; //判断这个键是否存在 if(m.count(name)) coutm[name]endl; else coutNot foundendl; } else if(op3) { cinname; if(m.count(name)) { m.erase(name); //删除键值 coutDeleted successfullyendl; } else coutNot foundendl; } else if(op4) { //获取大小 coutm.size()endl; } } return 0; }题目四#include iostream #include set //有序去重 using namespace std; setint a; int main() { int m; cinm; int op,l; while(m--) { cinopl; if(op1) { if(a.count(l)) { coutAlready Existendl; } else { a.insert(l); } } else if(op2) { if(a.empty()) { coutEmptyendl; continue; } auto ita.lower_bound(l); //找第一个 ≥l的元素迭代器 int del_len; //所有元素都比l小 if(ita.end())//返回指向 “最后一个元素下一位” 的迭代器 { del_len*a.rbegin(); a.erase(del_len); } //所有元素都比l大 else if(ita.begin())//返回指向第一个元素的迭代器 { del_len*a.begin(); a.erase(del_len); } else { int pre*prev(it);//l的前驱迭代器 int net*it;//l的后继或者它本身 if(l-prenet-l) { del_lenpre; a.erase(pre); } else { del_lennet; a.erase(net); } } coutdel_lenendl; } } return 0; }题目五#include iostream using namespace std; /* 枚举可能的结果 只有ABABAB的AB循环 或者BABABA的BA循环 所以s的最终情况只有这两种只要把s变成这两种形式的操作次数取最小值即可 s变成ABABAB 比较s跟ABABAB有几个不同也就是需要交换不同的字符数/2次即可 */ string a,b,s; int n; void fun() { for(int i1;i2*n;i) { if(i%2!0) { aA; bB; } else { aB; bA; } } } int calc() { int ans0,cnt0; for(int i0;i2*n;i) { if(a[i]!s[i]) { ans; } else if(b[i]!s[i]) { cnt; } } return min(ans,cnt)/2; } int main() { int t; cint; while(t--) { int net; cinns; fun();//创造两种形式的字符串 netcalc(); coutnetendl; } return 0; }