SCAU计算只因能

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)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值