题目链接:The 2019 ACM-ICPC China Shannxi Provincial Programming Contest
A:签到,按花费时间从小到大排个序
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N=118; 5 int a[N]; 6 int main() 7 { 8 int n,t; 9 while(~scanf("%d%d",&n,&t)) 10 { 11 for(int i=1;i<=n;i++) 12 scanf("%d",&a[i]); 13 sort(a+1,a+1+n); 14 int ans=0; 15 for(int i=1;i<=n;i++) 16 { 17 if(t>=a[i]) 18 { 19 t-=a[i]; 20 ans++; 21 } 22 else 23 break; 24 } 25 printf("%d\n",ans); 26 } 27 return 0; 28 }
L:签到,因为序列里的数都不一样,所以答案只跟n有关,两次同样的操作的话序列就换回来了,所以肯定是两个操作交替进行,然后照着题意打表找规律,注意1和3要特判
1 #include<cstdio> 2 int main() 3 { 4 int n,x; 5 while(~scanf("%d",&n)) 6 { 7 for(int i=0;i<n;i++) 8 scanf("%d",&x); 9 if(n==1) 10 printf("1\n"); 11 else if(n==3) 12 printf("6\n"); 13 else if(n%4==0) 14 printf("4\n"); 15 else if(n%4==1) 16 printf("%d\n",2*n); 17 else if(n%4==2) 18 printf("%d\n",n); 19 else 20 printf("12\n"); 21 } 22 return 0; 23 }
M:二分最短路,首先题意是,给出了一个星系里每个星球的路线图,然后有一艘飞船,它有三个属性,等级和最长的航行距离以及航行次数,初始都是0,然后可以升级,每升一级,花费费用c,最长航行距离增长d,航行次数增加e。如果某条路线的长度大于飞船的最长的航行距离,那么飞船不能走这条路线,并且每走一过一条路就消耗1的航行次数,当航行次数为0,飞船也不能走了。问从1号星球到n号星球的最小费用是多少。
我们就二分升级的次数,那么能走的路线就是长度小于等于次数*d的,在这个限制以每条路线距离为1,求一个1号星球到n号星球的最短距离,判断一下这个距离是不是小于等于次数*e。
1 #include<cstdio> 2 #include<queue> 3 using nam