WY3. 小易的升级之路
描述
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?输入描述
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力输出描述
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值示例1
输入:
3 50 50 105 200 5 20 30 20 15 40 100
输出:
110 205
C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2017-08-20
#include <stdio.h> int gcd (int m,int n){ if (n == 0) return m; else return gcd(n,m%n); } int main() { int n,a,num; while(~scanf("%d %d",&n,&a)){ for (int i=0;i<n;i++){ scanf("%d",&num); if (num <= a) a+=num; else a+=gcd(num,a); } printf("%d\n",a); } return 0; } /*#include <stdio.h> 辗转相除法求最大公约数 int gcd(int a,int b) { /*if(a%b==0) return b; return gcd(b,a%b); int temp; while(b) { temp=a%b; a=b; b=temp; } return a; } int b[100000]; int main() { int n,a; int i; int sum; while((scanf("%d%d",&n,&a))) { sum=a;; for(i=0;i<n;i++) { scanf("%d",&b[i]); if(b[i]<=sum) { sum=sum+b[i]; } else if(b[i]>sum) { sum=sum+gcd(sum,b[i]); } } printf("%d\n",sum); } return 0; }*/
C 解法, 执行用时: 2ms, 内存消耗: 380KB, 提交时间: 2020-08-27
#include<stdio.h> int max(int x,int y){ int temp; while(y){ temp=x%y; x=y; y=temp; } return x; } int main(){ int n,a,b; while(scanf("%d%d",&n,&a)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&b); if(a>=b) a+=b; else a+=max(a,b); } printf("%d\n",a); } return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 292KB, 提交时间: 2021-09-19
#include <stdio.h> int yueshu(int a,int b){ int n = a>b?a:b; for(int i=n;i>=1;i--){ if(a%i==0&&b%i==0){ return i; } } return 1; } int main(){ int n,a; while(scanf("%d %d",&n,&a)!=EOF){ int b[n]; for(int i=0;i<n;i++){ scanf("%d ",&b[i]); } for(int i=0;i<n;i++){ if(a>=b[i]){ a = a+b[i]; }else{ a = a + yueshu(a,b[i]); } } printf("%d\n",a); } return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 296KB, 提交时间: 2021-10-03
#include<stdio.h> int main() { int n = 0 , N = 0; while(scanf("%d %d",&n,&N) != EOF ) { int aby[n],i =0; while(i < n) { scanf("%d",&aby[i]); if(aby[i] <= N) { N += aby[i]; } else { int max = aby[i] , min = N , com = 0; while(max % min != 0) { com = max % min; max = min; min = com; } N += min; } i++; } printf("%d\n",N); } return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 304KB, 提交时间: 2021-10-10
#include<stdio.h> #include<string.h> int main() { int n, a, i; while (scanf("%d%d", &n, &a) != EOF) { int* p = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) { int input = 0; scanf("%d", &input); *(p + i) = input; } i = 0; while (n--) { if (a >= *(p + i)) { a += *(p + i); } else { int tmp = a; int c = 0; while (tmp>0) { c = *(p + i) % tmp; *(p + i) = tmp; tmp = c; } a += *(p+i); } i++; } printf("%d\n", a); } return 0; }