1.
此题需要了解一个知识点———优先队列
1.含义:优先队列同队列基本操作相同,但是队列内的元素是按照加入队列的顺序排序,但是优先队列可以按照单增、单减或自定义顺序排序。
2.头文件 #include <queue>
3.操作:同队列的插入(push)、删除(pop)、判断是否为空(empty())等操作相同。
4.定义:
priority_queue<int,vector<int>,greater<int>> q;//队列内单调递增排序
priority_queue<int,vector<int>,less<int>> q;//队列内单调递减排序
以下为本题代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N=1e5+10;
priority_queue<int,vector<int>,greater<int>> p;
int n;
int main(){
int ans=0;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
p.push(x);
}
while(1){
int tmp=0;
tmp+=p.top();
p.pop();
tmp+=p.top();
p.pop();
ans+=tmp;
if(p.size()==0) break;
p.push(tmp);
}
cout <<ans<<endl;
}
2.计算四阶行列式的值
用数学方法中的按行按列展开即可完成。
#include <iostream>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
double a[4][4];
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<4;j++) scanf("%lf",&a[i][j]);
}//shu ru
int x=1;
if(a[0][0]==0){
for(k=1;k<4;k++){
if(a[0][k]!=0){
for(i=0;i<4;i++){
int t;
t=a[i][0];
a[i][0]=a[i][k];
a[i][k]=t;
}
x=-1;
break;
}
}
}//bi mian fen mu wei ling right
double k0=a[0][0];
for(i=0;i<4;i++) a[0][i]/=k0;
double k1=a[1][0]/a[0][0];
for(i=0;i<4;i++){
a[1][i]-=k1*a[0][i];
}//1,0 bian 0
double k2=a[2][0]/a[0][0];
for(i=0;i<4;i++){
a[2][i]-=a[0][i]*k2;
}//2,0 bian 0
double k3=a[3][0]/a[0][0];
for(i=0;i<4;i++){
a[3][i]-=a[0][i]*k3;
}//3,0 bian 0
double m=a[1][1]*a[2][2]*a[3][3] + a[2][1]*a[3][2]*a[1][3] + a[1][2]*a[2][3]*a[3][1]-(a[1][3]*a[2][2]*a[3][1]+a[1][2]*a[2][1]*a[3][3]+a[1][1]*a[3][2]*a[2][3]);
printf("%.0lf\n",k0*a[0][0]*m*x);
}
}
3.
简单题
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int t;
cin>>t;
int h=0,m=0,s=0;
h=t/3600;
m=t%3600/60;
s=t%60;
printf("%d:%d:%d",h,m,s);
}
4.单调栈
模板题复习
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int stk[N],tt;
int main() {
int n;
cin>>n;
int i,j;
while(n--) {
int x;
cin>>x;
if(tt==0) {
stk[++tt]=x;
cout <<"-1"<<" ";
} else {
while(stk[tt]>=x) {
tt--;
}
if(tt==0) {
cout <<"-1"<<" ";
stk[++tt]=x;
}
else {
cout <<stk[tt]<<" ";
stk[++tt]=x;
}
}
}
}
5.
字符串哈希----模板题(要多复习,不然会忘记细节)
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
const int N=1e5+10;
char a[N];
ull h[N],p[N];//p[i]代表131的i次方
ull num(int l,int r){
return h[r]-h[l-1]*p[r-l+1];
}
int main(){
int n,m;
cin>>n>>m;
cin>>a+1;
int i;
p[0]=1;
for(i=1;i<=n;i++){
h[i]=h[i-1]*131+a[i];//哈希后的数组
p[i]=p[i-1]*131;
}
while(m--){
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
if(num(l1,r1)==num(l2,r2)) cout <<"Yes"<<endl;
else cout <<"No"<<endl;
}
}