对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
3 50 50 105 200 5 20 30 20 15 40 100
110 205
#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; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()) { Integer monsterCount = scanner.nextInt(); Integer initialPower = scanner.nextInt(); Integer currentPower = initialPower; for (int i = 0; i < monsterCount; i++) { Integer defensivePower = scanner.nextInt(); if (defensivePower <= currentPower) { currentPower += defensivePower; } else { currentPower += Main.getGreatestCommonDivisor(currentPower, defensivePower); } } System.out.println(currentPower); } scanner.close(); } private static Integer getGreatestCommonDivisor(Integer firstNum, Integer secondNum) { if (firstNum < secondNum) { int temp; temp = firstNum; firstNum = secondNum; secondNum = temp; } if (0 == secondNum) { return firstNum; } return Main.getGreatestCommonDivisor(secondNum, firstNum % secondNum); } }
#include<iostream>
using namespace std;
int GCD(int a,int b){//辗转相除法,后附证明
int temp;
while(b){
temp = b; b = a%b; a = temp;
}
return (a);
}
int main(){
int n,c;
while( cin >> n >> c ){
int i,temp;
for(i=0;i<n;i++){
cin >> temp;
if( c >= temp )
c += temp;
else
c += GCD(c,temp);
}
cout << c <<endl;
}
}
/*辗转相除法证明:
1.证明有相同公因子:用gcd(a,b) = c 表示a,b的最大公约数为c,设 a = ce, b = cf;
a/b = d 余数为 r。 则有 a = bd + r 则有ce = cfd + r 则有 r = (e-fd)c ,b = cf。
由此知 (b,r) 也有 c 的公因子,而 c 为a,b的最大公因子。
2.证明该公因子最大,即证明(e-fd) 和 f 互质。 假设不互质 即存在着某g>1。
使得 e-fd = gh ,f = gj 。a = ce = c(fd+gh) = c(gjd + gh) = cg(jd+h),b = cgj。
则(a,b) 有大于 c 的公因子 cg ,和已知矛盾,故假设错误。互质成立!c公因子最大。
3.由1,2知,a,b的最大公因子c。恰为b,r的最大公因子。 则gcd(a,b) = gcd(b,r)。辗转相除法成立!*/
import java.util.Scanner; public class Main { public static void main(String[] args) { System.out.println("输入怪的数量: "); Scanner in = new Scanner(System.in); int gNum = in.nextInt(); if(gNum<=0){ System.out.println("怪物数不能少于0个"); System.exit(0); } int[] array = new int[gNum]; System.out.println("输入小易初始能力值: "); int powNum = in.nextInt(); if(gNum<1||gNum>=100000){ System.out.println("生命值输入错误"); System.exit(0); } System.out.println("输入怪物的能力值:: "); for(int i=0;i<gNum;i++){ array[i] = in.nextInt(); if(array[i]<=0||array[i]>=10000){ System.out.println("怪物生命值输入错误"); System.exit(0); } } for(int i=0;i<gNum;i++){ powNum = powNum + fight(powNum,array[i]); } System.out.println("最终生命值为:"+ powNum); System.exit(0); } public static int fight(int i, int j){ if(i>=j) { return j; } else return maxYS(i,j); } public static int maxYS(int i,int j){ while (i%j != 0) { int temp = i%j; i = j; j = temp; } return j; } }
#include<iostream>
using namespace std;
intgcd(intm,intn)
{
if(m<n)
returngcd(n,m);
if(n==0)
returnm;
else
returngcd(n,m%n);
// return n == 0 ? m : gcd(n,m%n);
}
intmain()
{
intn,a;
inttemp;
while(cin>>n>>a){
for(inti = 0;i < n;i++){
cin>>temp;
if(a >= temp)
a += temp;
else
a += gcd(temp,a);
}
cout<<a<<endl;
}
return0;
}
|
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
//
System.out.println("请输入怪物数量和小易的初始能力值,以空格分隔:");
while
(input.hasNext()) {
// 怪物的数量
int n =
input.nextInt();
// 小易初始能力值
int ability =
input.nextInt();
// 定义怪物数组
int[] monsters = new
int[n];
// 输入每个怪物的防御力
for (int i = 0; i < n; i++)
{
monsters[i] = input.nextInt();
}
// 小易遇怪
for (int i = 0; i < n; i++) {
if (ability >
monsters[i] || ability == monsters[i]) {
ability = ability +
monsters[i];
} else {
ability = ability +
GCF(ability, monsters[i]);
}
}
// 打完怪了,输出结果
System.out.println(ability);
}
}
public static int GCF(int A,int B){
if(B==0){
return
A;
}else
return GCF(B,A%B);
}
}
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while((line = br.readLine()) != null){ String[] params = line.split(" "); int n = Integer.parseInt(params[0]); int a = Integer.parseInt(params[1]); for(int i = 0; i < n; i++){ int b = Integer.parseInt(br.readLine()); if(a >= b){ a += b; }else{ a += gcd(b, a); } } System.out.println(a); } } private static int gcd(int n, int m) { if(m == 0){ return n; } return gcd(m, n % m); } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNextInt()){ int n = sc.nextInt(); int a = sc.nextInt(); int[] nums = new int[n]; for(int i = 0;i < n;i++){ nums[i] = sc.nextInt(); if(nums[i] <= a) a += nums[i]; else a += method(a,nums[i]); } System.out.println(a); } } private static int method(int a ,int b){ //辗转相除法 while(b != 0){ int r = a % b; a = b; b = r; } return a; } }
//很详细 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int a=sc.nextInt(); //a表示怪物的数量 int b=sc.nextInt(); //b表示小易的初始化能力 int[] arr=new int[a]; for(int i=0;i<a;i++){ arr[i]=sc.nextInt(); //用数组arr把每个怪物的防御力记录下来 } for(int i=0;i<arr.length;i++){ if(b>=arr[i]){//如果能力大于等于怪物防御力,则直接加 b+=arr[i]; }else { b+=maxCommon1(arr[i],b);//如果能力小于怪物防御力,则直接加上它们的最大公约数 // b+=maxCommon2(arr[i],b); // b+=maxCommon3(arr[i],b); } } System.out.println(b); } } //求最大公约数方法1:穷举法 private static int maxCommon1(int a,int b){ if(a<b){ //如果a<b,先把ab交换,方便以后操作 int tmp=a; a=b; b=tmp; } //如果b能直接整除a,说明b是它们的最大公约数 if(a%b==0){ return b; } //否则从小的开始依次整除,当a和b同时能整除那个数的时候说明就是它们的最大公约数 for(int i=b-1;i>1;i--){ if(a%i==0&&b%i==0){ return i; } } return 1; //说明除完还没有找到,只能返回1 } //求最大公约数方法2:辗转相减法 /**两个数,相等时,最大公约数为他们其中任意一个。 不相等时,用大数减小数。得到的差和之前的那个小数再次相减,直到两个数相等,这两个中,任意一个都是最大公约数。 */ private static int maxCommon2(int a,int b){ while((a-b)!=0){ if(a>b){ a=a-b; }else { b=b-a; } } return b; } //求最大公约数方法3:辗转相除法 /** * 用大数对小数求余,若余数为0,则除数为最大公约数。 * 若余数不为0,将此余数作为除数,小数作为被除数,重新求余,直到余数为0为止。 * 此时的最大公约数为余数。例如:27和6. 27%6=3,6%3=0.所以最大公约数为3. */ private static int maxCommon3(int a,int b){ if(a<b){ //如果a<b,先把ab交换,方便以后操作 int tmp=a; a=b; b=tmp; } int n=a%b; while(a%b!=0){ a=b; b=n; n=a%b; } return b; } }
#include <iostream> #include <vector> using namespace std; int get_num(int num1,int num2) { while(num2) { int tmp = num2; num2 = num1 % num2; num1 = tmp; } return num1; } int main() { int num = 0,val = 0; while(cin>>num>>val) { vector<int> v(num,0); for(size_t i = 0;i<num;i++) { cin>>v[i]; } for(int j = 0;j < num;j++) { if(val >= v[j]) { val += v[j]; } else { int temp = get_num(val,v[j]); val +=temp; } } cout<<val<<endl; } return 0; }
//单纯的求最大公约数,辗转相除法 #include<iostream> using namespace std; int gcb(int a, int b) { if(b == 0) return a; return gcb(b, a%b); } int main() { int n,cap; while(cin>>n>>cap){ for(int i=0; i<n; i++){ int tmp; cin>>tmp; if(tmp <= cap){ cap += tmp; }else if(tmp > cap){ cap += gcb(tmp, cap); } } cout<<cap<<"\n"; } return 0; }
#include<iostream> #include<vector> #include<cmath> using namespace std; int gcd(int num1,int num2) { int Min=min(num1,num2); for(int i=Min;i>=1;i--) { if(num1%i==0&&num2%i==0) { Min=i; break; } } return Min; } int level(int index,int &a,vector<int> &ghost,int n) { if(index==n) return a; if(ghost[index]<=a) a+=ghost[index]; else a+=gcd(a,ghost[index]); return level(++index,a,ghost,n); } int main() { int n,a; while(cin>>n>>a) { vector<int> ghost(n); for(int i=0;i<n;i++) cin>>ghost[i]; cout<<level(0,a,ghost,n)<<endl; } return 0; }
#include <iostream> #include <vector> using namespace std; int gcd(int a,int b){ if( b == 0 ){ return a; } return gcd(b,a%b); } int main() { //code int n,a,in,get_power = 0; vector<int> power_; while(cin >> n >> a){ power_.clear(); get_power = a; if( n == 0 ){ cout<<a<<endl; continue; } for( int i = 0 ;i < n ; i ++ ){ cin>>in; power_.push_back( in ); } for( int i = 0; i < n ;i ++ ){ if( get_power >= power_[i] ){ get_power += power_[i]; }else{ get_power += gcd(get_power,power_[i]); } } cout<<get_power<<endl; } return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); int a = in.nextInt(); int[] b = new int[n]; for (int i = 0; i < n; i++) { b[i] = in.nextInt(); } int ans = getResult(a, b); System.out.println(ans); } } private static int getResult(int a, int[] b) { // TODO Auto-generated method stub // Arrays.sort(b); 注意:此处不能排序! for (int i = 0; i < b.length; i++) { if (a > b[i]) { a += b[i]; } else { a += maxCommonDivisor(a, b[i]); } } return a; } public static int maxCommonDivisor(int m, int n) { if (m < n) {// 保证m>n,若m<n,则进行数据交换 int temp = m; m = n; n = temp; } while (m % n != 0) {// 在余数不能为0时,进行循环 int temp = m % n; m = n; n = temp; } return n;// 返回最大公约数 } }
#include<iostream> #include<vector> using namespace std; int fun(int a,int b) { if(a==1||b==1) return 1; int i=2,j; while(i<=a&&i<=b) { if((a%i==0)&&(b%i==0)) j=i; i++; } return j; } int main() { int n,a,s,i,j; int *b; while(cin>>n>>a) { b=new int[n]; j=0;s=a; while(j<n) {cin>>b[j++];} for(i=0;i<n;i++) { if(s>=b[i]) s+=b[i]; else s+=fun(b[i],s); } cout<<s<<endl; delete[] b; } return 0; }
#include <iostream> #include <vector> using namespace std; int count(int a,int b){ while(a%b){ int temp=b; b=a%b; a=temp; } return b; } int main(){ int N,a,b; while(cin>>N>>a){ for(int i=0;i<N&&cin>>b;i++) if(b<=a) a+=b; else a+=count(a,b); cout<<a<<endl; } return 0; }
#include <iostream> #include <vector> using namespace std; typedef long long llint; llint gcd(llint a, llint b) { if(a%b==0)return b; return gcd(b,a%b); } int main() { int n; llint a; while(cin>>n>>a) { while(n--) { llint b; cin>>b; if(a>=b)a+=b; else a += gcd(a,b); } cout<<a<<endl; } return 0; }
// 主要是求解最大公约数,其它就是注意输入输出要求 #include<iostream> #include<vector> using namespace std; int GreatCommonDivision( int a, int b ) { int max = 0, min = 0, r = 0; a >= b ? ( max = a, min = b ) : ( max = b, min = a ); r = b; while ( r != 0 ) { r = a % b; a = b; b = r; } return a; } int main(void) { int num = 0, initValue = 0, defence = 0; vector<int> ivec; while ( cin >> num >> initValue ) { while ( num-- != 0 && cin >> defence ) ivec.push_back( defence ); for ( auto c : ivec ) { if ( initValue >= c ) initValue += c; else initValue += GreatCommonDivision( initValue, c ) ; } cout << initValue << endl; ivec.clear(); } return 0; }
#include<stdio.h> int get(int a,int b){//最大公约数 int n=a>b?a:b; int m=a<b?a:b; int p=n%m; while(p){ n=m; m=p; p=n%m; } return m; } int main(){ int n,a,b,i; while(scanf("%d %d",&n,&a)!=EOF){ for(i=0;i<n;i++){ scanf("%d",&b); if(b<=a){ a+=b; }else{ a+=get(a,b); } } printf("%d\n",a); } return 0; }
import java.util.*;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()) {intn = sc.nextInt();inta = sc.nextInt();int[] b = new int[n];for(inti = 0; i < n; i++) {b[i] = sc.nextInt();if(b[i] > a) {a += gcd(b[i], a);} else{a += b[i];}}System.out.println(a);}}public static int gcd(int m, int n) {return n == 0? m : gcd(n, m % n);}