2019牛客多校第七场 A.String ,B.Irreducible Polynomial, J.A+B problem

A.String

题意:

   给一个字符串,将字符串拆成尽可能少的几个字典序最小的字符串
   举例: "0101" is perfect as it is the smallest string among ("0101", "1010", "0101", "1010").后面的字符插到第一个位置

111011110       答案 :111 01111 0(111 在字符串111的字典序是最小的,其他也一样)
不可以将每个字符拆开,要求字符串数量尽可能小, 比如1110 在这个字符串中,0111比1110小,

题解:

   暴力模拟,将字符串拆分,然后组装,判断是否是最小,如果不是,向前推

#include <bits/stdc++.h>
using namespace std;
bool check(string u){
	string p = "";
	int len = u.size();
	for(int i = 1; i < len; i++){
		p = u.substr(i, len-i) + u.substr(0, i);
		if(u > p){
			return false;
		}
	}
	return true;
}
int main(){
	int t;
	cin >> t;
	while(t--){
		string s;
		cin >> s;
		int len = s.size();
		int l = 0, r = len;
		while(1){
			for(int i = r; i >= 0; i--){
				string tmp;
				tmp = s.substr(l, i);
				//cout << "截取字符串:"<<  tmp<<" 左边界 " << l << " 长度 " << i <<" "<<r<<  endl;
				if(check(tmp)){
					l += i;
					r = len-l;
					cout << tmp << " ";
					break;
				}
			}
			if(l == len){
				break;
			}	
		}
		cout << endl;
	}
	return 0;
}

B.Irreducible Polynomial

题意:

   给出一个多项式,问是否还能进行拆分

题解:

   当 n 大于2时,一定可以再拆分

   当n小于2时,一定不可以再拆分

   当 n等于 2时,判断与x轴是否有交点(判断是否有解),如果有,能,否则不能

#include<iostream>
#include<cstdio>
using namespace std;
int t, n;
long long a[25];
int main(){
   scanf("%d",&t);
   while(t--){
      scanf("%d", &n);
      for(int i = n; i >= 0;i--){
      	scanf("%lld", &a[i]);
      }
      if(n < 2){
      	printf("Yes\n");
      }
      else if(n > 2){
      	printf("No\n");
       }
      else{
         if(a[1] * a[1] - 4 * a[0] * a[2] < 0){
         	printf("Yes\n");
        }
         else{
         	printf("No\n");
        }
      }
   }
   return 0;
}

J.A+B problem 

题意:

   f(n) 表示对n取反,   f(12345)  = 54321,   求 f ( f (A) + f (B) )

题解:

   模拟,将A B 翻转后相加,然后逆序输出

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int t;
	cin >> t;
	while(t--){
		string s1, s2;
		cin >> s1 >> s2;
		int len1 = s1.size();
		int len2 = s2.size();
		ll sum1 = 0, sum2 = 0;
		for(int i = len1-1; i >= 0; i--){
			sum1 = sum1 * 10 + (s1[i] -'0');
		}
		for(int i = len2 - 1; i >= 0; i--){
			sum2 = sum2 * 10 + (s2[i] - '0');
		}
		ll sum = sum1 + sum2, k = 1;
		while(sum){
			while(k == 1 && sum % 10 == 0){
				sum = sum / 10;
			}
			cout << sum % 10;
			sum = sum / 10;	
			k = 2; 
		}
		cout << endl;
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值