首页 > 编程语言 >scau程序设计与算法(个人偷懒版(前两章

scau程序设计与算法(个人偷懒版(前两章

时间:2024-06-21 12:27:53浏览次数:13  
标签:CASE 输出 两章 int long 客户 偷懒 include scau

目录

1.四个常见问题

18104 练习使用多case解题

2.c++STL的运用

19116 丑数

18440 走迷宫

18276 走迷宫2

18105 银行的叫号顺序

18216 银行服务

18118 勇者斗恶龙

18107 校赛排名

18104 练习使用多case解题

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

多CASE的问题在般有3种情形:(1)有一个数字开始表明CASE数目;(2)以特殊标志表示结束;(3)要求处理到最后一行。
现要求你在程序一次运行中,依次处理上述3种情况。

有三批测试数据,第1批测试数据,开头会以一个数字告之该批CASE数量,每一个CASE是两个正整数;
第1批测试数据结束后,紧接着是第2批数据,每一个CASE同样是两个正整数,第2批测试数据以两个0结束;
第2批测试数据结束后,紧接着是第3批数据,每一个CASE也是两个正整数,第3批测试数据一直到数据输入结束;

要求,每一个CASE,输出两数的最小公倍数
第1批测试数据处理完毕时,输出“group 1 done”
第2批测试数据处理完毕时,输出“group 2 done”
第3批测试数据处理完毕时,输出“group 3 done”

输入格式

有三批测试数据,第1批测试数据,开头会以一个数字告之该批CASE数量,每一个CASE是两个正整数(最大2的31次方);
第1批测试数据结束后,紧接着是第2批数据,每一个CASE同样是两个正整数,第2批测试数据以两个0结束;
第2批测试数据结束后,紧接着是第3批数据,每一个CASE也是两个正整数,第3批测试数据一直到数据输入结束;

输出格式

要求,每一个CASE,输出两数的最小公倍数
第1批测试数据处理完毕时,输出“group 1 done”
第2批测试数据处理完毕时,输出“group 2 done”
第3批测试数据处理完毕时,输出“group 3 done”

输入样例

2
6 10
5 12
8 16
12 18
8 4
0 0
4 5
4 6

输出样例

30
60
group 1 done
16
36
8
group 2 done
20
12
group 3 done
#include <iostream>
using namespace std;
long long gcd(long long x,long long y)
{
    long long r=x%y;
    while(r!=0)
    {
        x=y;
        y=r;
        r=x%y;
    }
    return y;
}
int main()
{
    long long n,a,b,c;
    cin>>n;
    while(n--)
    {
        cin>>a>>b;
        c=a*b/gcd(a,b);
        cout<<c<<endl;
    }
    cout<<"group 1 done"<<endl;
    while(cin>>a>>b)
    {
        if(a==0&&b==0) break;
        c=a*b/gcd(a,b);
        cout<<c<<endl;
    }
    cout<<"group 2 done"<<endl;
    while(cin>>a>>b)
    {
        c=a*b/gcd(a,b);
        cout<<c<<endl;
    }
    cout<<"group 3 done"<<endl;
    return 0;
}

19116 丑数

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

“丑数”是指除了质因子2,3,5,不含其它质因子的正整数,例如由小到大前10个“丑数”为
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
现要求编写一个程序,输出指定第几位的“丑数”。

输入格式

第一行为正整数T(T<=10000), 表示case的数目。
此后T行,每行一个正整数 n (n <= 100000000).

输出格式

每一个n,输出第n个“丑数”

输入样例

3
1
2
9

输出样例

1
2
10
#include <iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
using namespace std;
long long ugly(long long x)
{
    priority_queue<long long ,vector<long long>,greater<long long>>pq;
    set<long long>s;
    s.insert(1);
    pq.push(1);
    long long cur=1;
    while(1)
    {
        if(cur==x) return pq.top();
        long long y=pq.top();
        pq.pop();
        if(s.find(y*2)==s.end())
        {
            pq.push(y*2);
            s.insert(y*2);
        }
        if(s.find(y*3)==s.end())
        {
            pq.push(y*3);
            s.insert(y*3);
        }
        if(s.find(y*5)==s.end())
        {
            pq.push(y*5);
            s.insert(y*5);
        }
        cur++;
    }
}
int main()
{
    long long T,n;
    cin>>T;
    while(T--)
    {
        cin>>n;
        long long h=ugly(n);
        cout<<h<<endl;
    }
    return 0;
}

18440 走迷宫

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

有一个N*M(N,M<=10)的格子迷宫,1代表该格子为墙,不能通过,0代表可以通过,人在迷宫中可以尝试上下左右四个方向移动。
另外,在迷宫中如果从左边走出迷宫会回到迷宫最右边一格(只要该格不是墙),行不变,同样,从右边走出迷宫会
回到迷宫最左边一格,向上走出迷宫会回到迷宫最下边一格,向下走出迷宫会回到迷宫最上边一格。
现在给定一个迷宫,以及起点和终点,问最少多少步可以走出迷宫。如果不能走出迷宫输出“die”。



 

输入格式

该程序为多CASE,第1行为CASE的数量
每一个CASE,第1行为两个数N(行)和M(列)
然后N行每行M个数,之后是起点坐标和终点坐标sc(行) sr(列) ec(行) er(列)


 

输出格式

如题


 

输入样例

2
4 3
011
010
110
110
0 0 3 2
2 2
01
10
0 0 1 1

输出样例

4
die

提示

第一个case,可以从(1,0)走到(1,2)
#include<iostream>
#include<cstring>
using namespace std;
char mapp[13][13];
int mm[13][13];
int xnext[4]={0,1,0,-1};//右下左上
int ynext[4]={1,0,-1,0};
int xsta,ysta,xend,yend;
int n,m;
bool flag=false;
void find_way(int x0,int y0)
{
    if(x0==xend&&y0==yend)
    {
        flag=true;
        return;
    }
    for(int i=0;i<4;i++)
    {
        int x1=(x0+xnext[i]+n)%n;
        int y1=(y0+ynext[i]+m)%m;
        if(mapp[x1][y1]=='0')
        {
            if(mm[x1][y1]==-1)
            {
                mm[x1][y1]=mm[x0][y0]+1;
                mapp[x1][y1]='1';
                find_way(x1,y1);
                mapp[x1][y1]='0';
            }
        }
    }
}


int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        memset(mm,-1,sizeof(mm));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>mapp[i][j];
            }
        }
        cin>>xsta>>ysta>>xend>>yend;
        mm[xsta][ysta]=0;
        flag=false;
        find_way(xsta,ysta);
        if(flag) cout<<mm[xend][yend]<<endl;
        else cout<<"die"<<endl;
    }
}

18276 走迷宫2

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

有一个N*M的格子迷宫,1代表该格子为墙,不能通过,0代表可以通过,另外,在迷宫中
有一些传送门,走到传送门的入口即会自动被传送到传送门的出口(一次传送算1步)。人在迷宫中可以尝试
上下左右四个方向移动。现在给定一个迷宫和所有传送门的出入口,以及起点和终点,
问最少多少步可以走出迷宫。如果不能走出迷宫输出“die”。

输入格式

该程序为多CASE,第1行为CASE的数量
每一个CASE,第1行为两个数N(行)和M(列)
然后N行每行M个数
之后是一个数W,为传送门的数量
之后每行一个传送门的入口坐标c1(行),r1(列)和出口坐标c2,r2
之后是起点坐标和终点坐标sc(行) sr(列) ec(行) er(列)

注:传送门出入口和起点坐标和终点坐标不会出现在墙的位置
所有数字不超过100

输出格式

如题

输入样例

2
4 3
011
011
110
110
1
1 0 2 2
0 0 3 2
2 2
01
10
0
0 0 1 1

输出样例

3
die
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#define x first
#define y second
 
using namespace std;
 
typedef pair<int,int> PII;
const int N=110;
int n,m,w,c1,r1,c2,r2,sc,sr,ec,er;
char g[N][N];
int d[N][N];
PII door[N][N];
 
void bfs(){
	memset(d,-1,sizeof(d));
	d[sc][sr]=0;
	queue<PII>q;
	q.push({sc,sr});
	while(!q.empty()){
		PII t=q.front();
		q.pop();
		if(door[t.x][t.y].x!=-1&&door[t.x][t.y].y!=-1){
			d[door[t.x][t.y].x][door[t.x][t.y].y]=d[t.x][t.y]+1;
			q.push({door[t.x][t.y].x,door[t.x][t.y].y});
			continue;
		}
		int dir[4][2]={0,1,0,-1,1,0,-1,0};
		for(int i=0;i<4;++i){
			int x=t.x+dir[i][0],y=t.y+dir[i][1];
			if(x>=0&&x<n&&y>=0&&y<n&&g[x][y]!='1'&&d[x][y]==-1){
				d[x][y]=d[t.x][t.y]+1;
				q.push({x,y});
			}
		}
	}
	
}
 
int main(){
	int kcase;
	cin>>kcase;
	while(kcase--){
		cin>>n>>m;
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				door[i][j].x=door[i][j].y=-1;
			}
		}
		for(int i=0;i<n;++i){
			cin>>g[i];
			getchar();
		}
		cin>>w;
		for(int i=0;i<w;++i){
			cin>>c1>>r1>>c2>>r2;
			door[c1][r1].x=c2;
			door[c1][r1].y=r2;
		}
		cin>>sc>>sr>>ec>>er;
		bfs();
		if(d[ec][er]==-1){
			cout<<"die"<<endl;
		}else{
			cout<<d[ec][er]<<endl;
		}
	}
	return 0;
}

18105 银行的叫号顺序

时间限制:8000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

银行的叫号过程是一个优先队列的典型应用,假设,银行有4类客户,分别用优先级1,2,3,4表示,级别越高
则更优先得到服务,例如,当前有三个人排队,两个1级客户,一个3级客户,则银行叫号时,3级客户将先得到服务
,即使另两个1级有客户比他先到。当多个同级的客户将获得服务时,由先到的客户先得到服务。

假设,银行只有一个服务窗口,一次只能服务一个客户,假设该窗口每5分钟服务一个客户,即叫号的时刻分别
为0分钟、5分钟、10分钟、.....如果在叫号的时侯,没有客户,银行职员会去喝杯咖啡或上个洗手间,5分钟后
再继续叫号。

银行给出一系列客户到来的记录,每条记录包括“客户到来的时”,“客户等级”,“客户姓名”(由一个单词构成),请输
出银行服务的客户的顺序。

输入格式

第一数字是客户的数量n(n<=100000)
此后,每一行是一个客户来访信息,包括3个数字,到来的时刻(分钟整点,最大10的8次方)、等级、姓名(最多20个字母)
(已经按到来时刻排序)

输出格式

按服务的先后顺序输出客户的姓名

输入样例

4
0 1 John
3 1 Smith
3 1 Tom
4 2 Flod

输出样例

John
Flod
Smith
Tom
#include<iostream>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
typedef pair<int,string>PIS;
priority_queue<PIS>q;
int main()
{
    int n;
    int ret=99999;
    int lev,time ,realtime=0;
    string name;
    cin>>n;
    while(n--)
    {

        cin>>time>>lev>>name;
        while(1)
        {
            if(time<=realtime)
            {
                q.push({lev*100000+ret,name});
                ret--;
                break;
            }
            if(!q.empty())
            {
                cout<<q.top().second<<endl;
                q.pop();
            }
            realtime+=5;
        }
    }
    while(!q.empty())
    {

        cout<<q.top().second<<endl;
        q.pop();
    }
}

18216 银行服务

时间限制:8000MS  代码长度限制:10KB
提交次数:100 通过次数:8

题型: 编程题   语言: G++;GCC;VC

Description

银行通过叫号来决定服务用户的顺序,假设,银行有4类客户,分别用优先级1,2,3,4表示,级别越高
则更优先得到服务,例如,当前有三个人排队,两个1级客户,一个3级客户,则银行叫号时,3级客户将先得到服务
,即使另两个1级的客户比他先到。当多个同级的客户将获得服务时,由先到的客户先得到服务。

假设,银行只有一个服务窗口,一次只能服务一个客户,假设该窗口每5分钟服务一个客户,即叫号的时刻分别
为0分钟、5分钟、10分钟、.....如果在叫号的时侯,没有客户,银行职员会去喝杯咖啡或上个洗手间,5分钟后
再继续叫号。

有一种情况,银行工作到一定时间是要下班的,所以到一定时间,如果后面还有客户,将不再提供服务。

银行给
出一系列客户到来的记录,每条记录包括“客户到来的时间”,“客户等级”,“客户姓名”(由一个单词构成),请输
出该银行这一轮服务的客户的顺序。

输入格式

第一行两个数字,第一数字是客户的数量n(n<=100000),第二个数字是银行关门的时间,到这个时间,即关门,该点及之后,
不再叫号,但之前已经叫号的客户会继续服务到完结。
此后,每一行是一个客户来访信息,包括3个数字,到来的时刻(分钟整点,最大10的8次方)、等级、姓名(最多20个字母)
(已经按到来时刻排序,注意:同一时刻可能会同时到来多个客户,这时若为同等级的,数据出现得早的稍早得到服务)

输出格式

按服务的先后顺序输出客户的姓名

输入样例

4 12
0 1 John
3 1 Smith
3 1 Tom
4 2 Flod

输出样例

John
Flod
Smith
#include<iostream>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
typedef pair<int,string>PIS;
priority_queue<PIS>q;
int main()
{
    int n,t0;
    int ret=99999;
    int lev,time ,realtime=0;
    string name;
    cin>>n>>t0;
    while(n--)
    {

        cin>>time>>lev>>name;
        while(1)
        {
            if(time<=realtime)
            {
                q.push({lev*100000+ret,name});
                ret--;
                break;
            }
            if(!q.empty())
            {
                cout<<q.top().second<<endl;
                q.pop();
            }
            realtime+=5;
        }
    }
    while(!q.empty())
    {
        if(realtime>=t0) break;
        cout<<q.top().second<<endl;
        q.pop();
        realtime+=5;
    }
}

18118 勇者斗恶龙

时间限制:800MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

有n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙
一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只
能砍一个头(且不能被雇佣两次)

输入格式

多组数据,每组数据的第一行为正整数n和m(1<=n,m<=200000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为
一个整数,即每个骑士的能力。输入结束标志n=m=0;

输出格式

输出格式:每组数据,输出最少花费,无解输出"Loowater is doomed!"

输入样例

2 3
5
4
7
8
4
2 1
5
5
10
0 0

输出样例

11
Loowater is doomed!
#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
using namespace std;
const int maxn =200001;
int A[maxn],B[maxn];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++) cin>>A[i];
        for (int i=0;i<m;i++) cin>>B[i];
        sort(A,A+n);
        sort(B,B+m);
        int cur=0,cost=0;
        for(int i=0;i<m;i++)
        {
            if(B[i]>=A[cur])
            {
                cost=cost+B[i];
                cur++;
                if(cur==n) break;
            }
        }
        if(cur<n)
        {
            cout<<"Loowater is doomed!"<<endl;
        }
        else cout<<cost<<endl;
    }
    return 0;
}

18107 校赛排名

时间限制:4000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

校赛结束了,每一个参赛选手由3个数据项构成(通过题数,用时分钟数,姓名),排名按照通过题数排序
通过题数多的排前,同题数的,罚时少的排前。如果题数相同,罚时也相同,而按数据读取的先后排。
给你N个参赛选手的数据,按排序先后,输出姓名

输入格式

第一个数为N,(N<=500000)
此后,每行一个参赛选手的数据,通过题数,用时分钟数,姓名,前两者为整型数,姓名为字符串(不多于20个字符)

输出格式

姓名排名

输入样例

4
3 5 Jon
5 100 Smith
3 5 Tom
6 95 Hel

输出样例

Hel
Smith
Jon
Tom

提示

由于有500000个数据,输入和输出务必使用scanf和printf
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student
{
    int cnt;
    long long time;
    char name[21];
} student[500000];

bool cmp(Student a,Student b)
{
    if(a.cnt!=b.cnt) return a.cnt>b.cnt;
    if(a.time!=b.time) return a.time<b.time;
    return false;
}
int main()
{
    long long n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        scanf("%d%d%s",&student[i].cnt,&student[i].time,&student[i].name);
    }
    stable_sort(student,student+n,cmp);
    for(int i=0; i<n; i++)
    {
        printf("%s\n",student[i].name);
    }
    return 0;
}

标签:CASE,输出,两章,int,long,客户,偷懒,include,scau
From: https://blog.csdn.net/2302_80776046/article/details/139857707

相关文章

  • 今天又在偷懒了
    偷懒偷懒偷懒偷懒懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒偷懒懒偷懒偷懒偷懒偷懒偷懒偷懒......
  • 【scau数据库实验一】mysql_navicat_数据库定义实验、基本命令
    实验一开始之前,如果还有不会使用navicat建议花五分钟补课哦~补课地址:【scau数据库实验先导】mysql_navicat_数据库新建、navicat的使用-CSDN博客实验目的:理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。实验报告要求:实验报......
  • 【SCAU操作系统】实验三单处理器系统的进程调度python源代码及实验报告参考
    一、课程设计目的        1.加深对进程概念的理解,明确进程和程序的区别。        2.深入了解系统如何组织进程、创建进程。        3.进一步认识如何实现处理器调度。二、课程设计内容        编写程序完成单处理器系......
  • 【SCAU操作系统】实验二页面置换算法的模拟实现及命中率对比python源代码及实验报告参
    一、课程设计目的通过请求页式管理方式中页面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理中的页面置换算法。二、课程设计内容模拟实现OPT(最佳置换)、FIFO和LRU算法,并计算缺页率。三、要求及提示1、首先用随机数生成函数......
  • SCAU 18705 01背包问题
    18705 01背包问题时间限制:1000MS 代码长度限制:10KB题型:编程题   语言:不限定Description有一个容积为M的背包和N件物品。第i件物品的体积W[i],价值是C[i]。求解将哪些物品装入背包可使价值总和最大。每种物品只有一件,可以选择放或者不放入背包。输入格式第一......
  • SCAU 19523 最长上升子序列长度
    19523 最长上升子序列长度时间限制:1000MS 代码长度限制:10KB题型:编程题   语言:不限定Description当元素ai1<ai2<……<aiK。就说这个序列是有序上升的。给定序列(a1,a2,……,aN),存在许多这样的子序列(ai1,ai2,……,aiK),其中1<=i1<i2<……<iK......
  • 对于前三次的pta题集练习,由于我的偷懒和迟钝,有许多部分没有完成,但在此我还是对题目集
    第一道大题题目信息7-1答题判题程序-1分数50作者蔡轲单位南昌航空大学设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。输入格式:程序输入信息分三部分:1、题目数量格式:整数数值,若超过1位最高位不能为0,......
  • copier:万能的对象拷贝偷懒神器
    copier:万能的对象拷贝偷懒神器原创 golang学习记 golang学习记 2024-04-0710:29 四川 听全文如果你干什么事都专注一点那么你就会超过80%的人如果你在一个点上坚持5年那么你进入10%都有可能 我见过的最美的一天是你穿过人群找到我的那一天 g......
  • SAM/广义 SAM 非常偷懒的解释
    这里是模板题P6139。进行了一个广义SAM的学习。离线部分OiWiki讲得很好,但是在线部分没有。我做一些补充。首先SAM是什么?简单来说,SAM是一个有向无环图,节点是状态,对应一个endpos(\(S\)子串\(t\)的结尾位置集合)。边标有字符。SAM是有\(t_0\)初始状态,若干个结尾......
  • 《程序是怎么跑起来的》的第一次前两章总结
    读了《程序是怎样跑起来的》这本书的第一章之后,让我对CPU的理解更加深入。刚开始我只认为它是相当于计算机的大脑,原来它对于程序员来说不止如此,它还是CPU,寄存器,内存,内存地址,程序计数器,累计寄存器,标志寄存器和基址寄存器。它的内部是由寄存器,控制器,运算器和时钟四部分构成。平常......