1.银行叫号:
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <utility>
#include <vector>
#include <cmath>
using namespace std;
const int N = 1e6;
typedef long long ll;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
struct ilk{
int time;
int grade;
string name;
};
bool cmp(struct ilk a,struct ilk b){
if(a.grade!=b.grade){
return a.grade>b.grade;
}
return a.time<b.time;
}
int main(){
IOS;
int T;
ilk tmp;
queue<ilk> a;
multiset<ilk,decltype(&cmp)> b(cmp);
cin>>T;
while(T--){
cin>>tmp.time>>tmp.grade>>tmp.name;
a.push(tmp);
}
for(int cur = 0;!a.empty()||!b.empty();cur+=5){
while(!a.empty()&&(a.front()).time<=cur){
b.insert(a.front());
a.pop();
}
if(!b.empty()){
cout<<(*b.begin()).name<<endl;
b.erase(b.begin());
}
}
return 0;
}
2.校赛排名2
#include <iostream>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
const int N =1e6;
typedef long long ll;
class group{
public:
int AC;
int time;
string name;
vector<vector<int>> info;
group(){
this->AC=0;
this->time=0;
this->info = vector<vector<int>>(15,vector<int>(2,-1));
}
};
vector<group> groups;
int search(string name1){
for(int i=0;i<groups.size();i++){
if(name1==groups[i].name){
return i;
}
}
return -1;
}
bool cmp(group a,group b){
if(a.AC!=b.AC) return a.AC>b.AC;
return a.time<b.time;
}
int main(){
IOS;
int time,result;
string name;
char xuhao;
while(cin>>time>>name>>xuhao>>result){
int index = search(name);
if(index==-1){
group new_group;
new_group.name = name;
index = groups.size();
groups.push_back(new_group);
}
if(groups[index].info[xuhao-65][0]==0){
continue;
}
if(result!=0) groups[index].info[xuhao-'A'][1]++;
else{
groups[index].AC++;
groups[index].time += time+(groups[index].info[xuhao-'A'][1]+1)*20;
}
}
sort(groups.begin(),groups.end(),cmp);
for(auto it:groups){
if(it.AC!=0){
cout<<it.name<<" "<<it.AC<<" "<<it.time<<endl;
}
}
return 0;
}
3.偷懒的士兵2
#include <iostream>
#include <algorithm>
#include <limits.h>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
int n;
int search(int n,int min_pos,int step){
if(n<3){
return min_pos;
}
if(n==3){
return INT_MAX;
}
int deleodd = search(n/2,min_pos+step,step*2);
int deleeven = search((n+1)/2,min_pos,step*2);
return min(deleodd,deleeven);
}
int main(){
IOS;
while(cin>>n&&n){
cout<<(search(n,1,1)<INT_MAX?search(n,1,1):0)<<endl;
}
return 0;
}
4.迷宫1
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 120;
int map[N][N],st[N][N];
int row,col,sx,sy,ex,ey;
#define x first
#define y second
struct door{
int ox,oy;
}doors[N];
typedef pair<int,int> PII;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
void bfs(){
queue<PII> q;
q.push({sx,sy});
st[sx][sy]=0;
while(q.size()){
PII t = q.front();
q.pop();
if(map[t.x][t.y]>1){
int index = map[t.x][t.y];
int outx = doors[index].ox,outy = doors[index].oy;
st[outx][outy] = st[t.x][t.y]+1;
q.push({outx,outy});
}
else{
for(int i=0;i<4;i++){
int x=t.x+dx[i],y=t.y+dy[i];
if(x<0||x>=row||y<0||y>=col||map[x][y]==1) continue;
if(st[x][y] != -1) continue;//走过的地方不走
st[x][y] = st[t.x][t.y]+1;
q.push({x,y});
}
}
}
}
int main(){
int T;
cin>>T;
while(T--){
//初始化
memset(st,-1,sizeof st);//将st初始化为-1,-1代表未经过
cin>>row>>col;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
scanf("%1d",&map[i][j]);
}
}
int ndoor;
int cnt=2;
cin>>ndoor;
while(ndoor--){
int inx,iny,outx,outy;
cin>>inx>>iny>>outx>>outy;
map[inx][iny]=cnt;
doors[cnt++] = {outx,outy};
}
cin>>sx>>sy>>ex>>ey;
bfs();
if(st[ex][ey]!=-1) cout<<st[ex][ey]<<endl;
else cout<<"die"<<endl;
}
return 0;
}
5.迷宫2
#include <iostream>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
const int N =60;
typedef long long ll;
int T;
int map[N][N],st[N][N];
int sx,sy,ex,ey,n,m;
#define x first
#define y second
typedef pair<int,int> PII;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
void bfs(){
queue<PII> q;
q.push({sx,sy});
st[sx][sy] = 0;
while(q.size()){
auto t=q.front();
q.pop();
if(t.x==ex&&t.y==ey) return;
for(int i=0;i<4;i++){
int x=t.x+dx[i],y=t.y+dy[i];
x = (x+n)%n,y = (y+m)%m;
if(st[x][y]!=-1||map[x][y]==1) continue;
st[x][y] = st[t.x][t.y]+1;
q.push({x,y});
}
}
}
int main(){
cin>>T;
while(T--){
memset(st,-1,sizeof st);
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%1d",&map[i][j]);
}
}
cin>>sx>>sy>>ex>>ey;
bfs();
if(st[ex][ey]!=-1) cout<<st[ex][ey]<<endl;
else cout<<"die"<<endl;
}
}
6.分数拆分:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
long long k,x,y,z;
while(cin>>k&&k){
for(z = k+1;z<=3*k;z++){
//两项
y = k*z/(z-k);
if(k*z%(z-k)==0&&y>=z){
printf("1/%lld=1/%lld+1/%lld\n",k,y,z);
}
//三项
long long p = k*z/(z-k);
for( y = p+1;y<=2*p+1;y++){
x = k*z*y/(z*y-k*z-k*y);
if(k*z*y%(z*y-k*z-k*y)==0&&x>=y&&x>=z&&y>=z){
printf("1/%lld=1/%lld+1/%lld+1/%lld\n",k,x,y,z);
}
}
}
cout<<endl;
}
return 0;
}
## 注意事项:
### 1.多case:
1.开longlong
### 2.杂题:
1.丑数与非丑数:cnt和i怎么处理,最后结果为什么
2.勇者斗恶龙:ita!=a.end()&&*itb>=*ita条件先后问题
3.小明打牌:n的时候不丢最小牌
### 3.数学推导:
1.分数拆分:约束条件,先遍历z,可以算出y,再遍历x,注意推导出z的遍历范围k+1到3k,尤其注意y的遍历范围是p+1到2p+1,这里2p+1的原因是p向下取整了
2.龙龙:切记切记!!!加上 n<0!
### 4.dp:
1.皇后:注意数组和对角线表示方法cur-i和i-cur是一样的效果
2.快乐:注意状态转移方程(f[i][j]=max(f[i-1][j],f[i-1][j-lp[i]]+h[i])
### 5.士兵:
1.巡逻与偷懒
2.偷懒2
### 6.校赛:
1.排名1
2.排名2
### 7.思想:
1.万国之湖 ans--一定要放在merge的if(an[x]!=an[y])里面
2.树状数组:注意包含左右两边顶点,应query(l-1,r)