1.游戏
问题描述
小明和小芳出去乡村玩,小明负责开车,小芳来导航。
小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走 s公里小明会增加 s 2的疲劳度。
例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2) 2+2+2 2=16+2+4=22。
现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。
小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走 s公里小明会增加 s 2的疲劳度。
例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2) 2+2+2 2=16+2+4=22。
现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。
输入格式
输入的第一行包含两个整数
n,
m,分别表示路口的数量和道路的数量。路口由1至
n编号,小明需要开车从1号路口到
n号路口。
接下来 m行描述道路,每行包含四个整数 t, a, b, c,表示一条类型为 t,连接 a与 b两个路口,长度为 c公里的双向道路。其中 t为0表示大道, t为1表示小道。保证1号路口和 n号路口是连通的。
接下来 m行描述道路,每行包含四个整数 t, a, b, c,表示一条类型为 t,连接 a与 b两个路口,长度为 c公里的双向道路。其中 t为0表示大道, t为1表示小道。保证1号路口和 n号路口是连通的。
输出格式
输出一个整数,表示最优路线下小明的疲劳度。
样例输入
6 7
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
样例输出
76
样例说明
从1走小道到2,再走小道到3,疲劳度为5
2=25;然后从3走大道经过4到达5,疲劳度为20+30=50;最后从5走小道到6,疲劳度为1。总共为76。
数据规模和约定
对于30%的评测用例,1 ≤
n ≤ 8,1 ≤
m ≤ 10;
对于另外20%的评测用例,不存在小道;
对于另外20%的评测用例,所有的小道不相交;
对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 10 5,1 ≤ a, b ≤ n, t是0或1, c ≤ 10 5。保证答案不超过10 6。
对于另外20%的评测用例,不存在小道;
对于另外20%的评测用例,所有的小道不相交;
对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 10 5,1 ≤ a, b ≤ n, t是0或1, c ≤ 10 5。保证答案不超过10 6。
#include<iostream>
#include<queue>
using namespace std;
queue<int>stu;
int main()
{
int num=1;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
stu.push(i);
}
while(stu.size()>1)
{
int top=stu.front();
stu.pop();
if(num%k!=0&&num%10!=k)
{
stu.push(top);
}
num++;
}
cout<<stu.front();
return 0;
}
2.火车购票
问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
输入的第一行包含一个整数
n,表示购票指令的数量。
第二行包含 n个整数,每个整数 p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
第二行包含 n个整数,每个整数 p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
输出
n行,每行对应一条指令的处理结果。
对于购票指令 p,输出 p张车票的编号,按从小到大排序。
对于购票指令 p,输出 p张车票的编号,按从小到大排序。
样例输入
4
2 5 4 2
2 5 4 2
样例输出
1 2
6 7 8 9 10
11 12 13 14
3 4
6 7 8 9 10
11 12 13 14
3 4
样例说明
1) 购2张票,得到座位1、2。
2) 购5张票,得到座位6至10。
3) 购4张票,得到座位11至14。
4) 购2张票,得到座位3、4。
2) 购5张票,得到座位6至10。
3) 购4张票,得到座位11至14。
4) 购2张票,得到座位3、4。
评测用例规模与约定
对于所有评测用例,1 ≤
n ≤ 100,所有购票数量之和不超过100。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int main(){
int n,t,a[21][7];
memset(a,0,sizeof(a));
for(int i=0;i<20;i++) a[i][5]=5;//设置一个 20 * 6 的数组,注意下标是从0开始的,
//每行多出来的一个位置用来存放该行剩余的空座位
scanf("%d",&n);
while(n--){
scanf("%d",&t);
int flag=0;
for(int i=0;i<20;i++){
if(a[i][5]>=t)
{
a[i][5]-=t;
for(int j=0;j<5;j++)
{
if(!a[i][j])
{
a[i][j]=1;
t--;
if(t) printf("%d ",i*5+j+1);//座位号为 i*5+j+1 上面已经有人了
else{
if(n) printf("%d\n",i*5+j+1);
else printf("%d",i*5+j+1);
flag=1;
break;
}
}
}
}
if(flag) break;
}
if(!flag){//无连续的座位
for(int i=0;i<20;i++){
for(int j=0;j<5;j++){
if(!a[i][j]){
a[i][j]=1;
t--;
a[i][5]--;
if(t) printf("%d ",i*5+j+1);
else{
if(n) printf("%d\n",i*5+j+1);
else printf("%d",i*5+j+1);
flag=1;
break;
}
}
}
if(flag) break;
}
}
}
return 0;
}
/*从前向后遍历数组的每一行,如果该行的空余数量大于等于t,遍历该行,输出连续座位,break
否则,从第一行空位开始往下数t个,输出并标记*/