2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(题解)

传送门

A.同源

这题只需要两个for循环暴力模拟就可以过了
但是有没有大佬在下面讲解一下原理,为什么只要循环到10就能跑出来。。
直接上AC代码:

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)	
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
inline ll gcd(ll a,ll b){return b == 0? a:gcd(b, a % b);}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll Mode(ll a, ll b, ll mode)    {ll sum = 1;if(mode == 1)return 0 ;while (b) {if (b & 1) {sum = (sum * a) % mode;b--;}b /= 2;a = a * a % mode;}return sum;}
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
const ll mod = 1e9 + 7;
ll n , k ;
void solve()
{
	scanf("%lld%lld",&n,&k) ;
	int flag = 0 ;
	if(n%k == 0){
        n /= k ;
		for(ll i = 2 ; i <= 10 ; i++){
		    for(ll j = i ; j <= 10 ; j++){
				ll z = n - i - j ;
	            if( z <= 1) continue ;
				if(gcd(i,j)==1&&gcd(i,z)==1&&gcd(z,j)==1){
					printf("%lld %lld% lld\n",k*i,k*j,k*z) ;
					flag = 1 ;
					break ;
				}
			}
			if(flag)
				break ; 
		}
	}
	if(!flag)
		printf("-1 -1 -1\n") ;
}
int main()
{
	T{
		solve() ;
	}
	return 0 ;
}

B.分子

这个题目就是算化学式的分子量。
题目还是很友好的,只给了我们3个不同的元素,并且保证了没有括号套括号的样例,只要简单的暴力就行
下面就是AC代码

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)	
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
inline ll gcd(ll a,ll b){return b == 0? a:gcd(b, a % b);}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll Mode(ll a, ll b, ll mode)    {ll sum = 1;if(mode == 1)return 0 ;while (b) {if (b & 1) {sum = (sum * a) % mode;b--;}b /= 2;a = a * a % mode;}return sum;}
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
const ll mod = 1e9 + 7;
char a[maxn] ;
ll end = 0 ,xlen;
int  y[3] = {13,1 ,17} ;
ll findnum(int x){  //处理出现数字的问题(都是字符串的方式读取的)
	ll num = 0 ;
	for(int i = x ; i < xlen  ;i++){
		if(a[i] > '9' ||a[i] < '0'){
			end = i;return num ;
		}
			
		else{
			num =  num*10 + (a[i] - '0') ;
		}
	}
}
ll kuohao(int x){   //解决出现括号的问题
	ll ans = 0 ;
	for(int i = x ;i < xlen ; i++){
		if(a[i] == ')'){
			if(a[i+1] >='0'&&a[i+1] <='9')
				return ans *findnum(i+1) ;
			else{
				return ans ;end = i ;
			}
				
		}
		else{
			int cnt = 0 ;
			if(a[i] == 'C') cnt=y[0] ;
			else if(a[i] == 'H') cnt = y[1] ;
			else cnt=y[2] ;
			if(a[i+1] >='0'&&a[i+1] <='9'){
				ans += cnt *findnum(i+1) ;
				 i = end  - 1 ;
			}
			else{
				ans +=  cnt ;
			}	
		} 
	}
}
void solve()
{
	scanf("%s",a) ;
	xlen = strlen(a) ;
	ll ans = 0 ;
	for(int i = 0  ; i < xlen ;i++){
		int cnt = 0 ;
		if(a[i] == '('){
			ans +=kuohao(i) ;
			i = end  - 1;
			continue ;
		}
		else if(a[i] == 'C') cnt=y[0] ;
		else if(a[i] == 'H') cnt = y[1] ;
		else cnt=y[2] ;
		if(a[i+1] >='0'&&a[i+1] <='9'){
			ans += cnt *findnum(i+1) ;
			i = end - 1 ;
		}
		else
		{
			ans +=  cnt ;
		}
	}
	printf("%lld\n",ans) ;	

	
}
int main()
{
	
	solve() ;
	
	return 0 ;
} 

F.游戏

只要输出Yes就可以啦。。
不论如何,只要是先手,都是获胜的。

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)	
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
inline ll gcd(ll a,ll b){return b == 0? a:gcd(b, a % b);}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll Mode(ll a, ll b, ll mode)    {ll sum = 1;if(mode == 1)return 0 ;while (b) {if (b & 1) {sum = (sum * a) % mode;b--;}b /= 2;a = a * a % mode;}return sum;}
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
const ll mod = 1e9 + 7;
int main()
{
	T
	{
		int n ;
		cin >> n ;
		for(int i = 0 ; i < n ; i++){
			int a,b ;
			cin >> a >> b ;
		}
		printf("Yes\n") ;
	}
	return 0 ;
}

猜你喜欢

转载自blog.csdn.net/zcmuhc/article/details/107834165
今日推荐