水题(6)CSU内部题

目录

小Y的彩色立方体

小z的远古讯息

2017年院赛D题 简单加密

2017年院赛E题 守望者的逃离

2017年院赛H题 最大异或和


小Y的彩色立方体

题目:

水题(6)CSU内部题_第1张图片

水题(6)CSU内部题_第2张图片

代码:

#include
#include
using namespace std;
 
int main()
{
   char a1,a2,a3,b1,b2,b3,e;
   int cas=1;
   while(cin>>e>>e>>a1>>a2>>a3>>e>>e>>e>>b1>>b2>>b3>>e)
   {
       cout<<"Case "<a3)swap(a1,a3);
       if(a2>a3)swap(a2,a3);
       if(a1>a2)swap(a1,a2);
       if(b1>b3)swap(b1,b3);
       if(b2>b3)swap(b2,b3);
       if(b1>b2)swap(b1,b2);
       if(a1==b1&&a2==b2&&a3==b3)
        cout<<"Same "<

小z的远古讯息

题目:

水题(6)CSU内部题_第3张图片

水题(6)CSU内部题_第4张图片

水题(6)CSU内部题_第5张图片

水题(6)CSU内部题_第6张图片

水题(6)CSU内部题_第7张图片

 

代码:

#include
#include>
using namespace std;
 
char c[400][400];
int num[52];
 
int getrank(char c)
{
    if(c>='a')return c-'a';
    return c-'A'+26;
}
char getchar(int r)
{
    if(r<26)return 'a'+r;
    return 'A'+r-26;
}
 
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<52;i++)num[i]=0;
        for(int i=0;ii)up=i;
             if(downj)left=j;
             if(right

2017年院赛D题 简单加密

 

题目:

 

简单加密

 

Description:

小A和小B之间有数字信息来往,但是小A担心自己发送给小B的私密信息泄露被他人获取,于是他打算研究一个简单的加密方法只有自己和小B看得懂。小A给小B发送的信息保证都是1~9之间的数字,小A通过奇数位上的数字表示个数,对应的下一个偶数位的数字表示对应个数的数字来加密(比如:2635表示两个6连着3个5加密之后就是66555),如果最后一位是奇数位置结尾个数表示n,那么连着的加密串就是n个*(比如263加密后就是66***)。

 

Input:

第一行输入一个正整数T表示数据组数(T<=1000)

接下来T行每行输入一个字符串表示小A要发送给小B的信息(字符串长度不超过100)

 

Output:

对于每组数据输出一行小A信息加密之后的字符串

 

Sample Input:

2

2635

263

 

Sample Ouput:

66555

66***

 

标程:

 

#include 
#include 

using namespace std;

int main()
{
	int T ;
	char str[105] , ans[1005];
	scanf("%d" , &T);
	while(T--){
		scanf("%s" , str);
		int len = strlen(str);
		int pos = 0;
		for(int i=0 ; i= len) ch='*';
			else ch=str[i+1];
			for(int j=0 ; j

 

 

我的代码:

#include
#include
using namespace std;

int main()
{
	char c[101];
	int t;
	cin>>t;
	while(t--)
	{
		cin>>c;
		int k=0,l=strlen(c);
		while(k<=l-2)
		{
			for(int i=0;i

2017年院赛E题 守望者的逃离

题目:

 

Description:
恶魔猎手尤迪安野心勃勃,她背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 
现在一直守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为正数秒。距离单位为米(m)。
Input:
第一行一个整数t,代表有t组数据,接下来t行,每一行包括空格隔开的三个非负整数M, S, T。
Output:
对于每一组数据输出两行,第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。
SampleInput:
1
39 200 4
SampleOutput:
No
197

 

标程:

#include 
#include 

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);
	int m, s, t, times;
	cin>>times;
	while(times--){
		cin >> m >> s >> t;
		int m_n=m, s_n=0, t_n=0;
		while (t_n < t&&s_n < s){
			if (m_n >= 10)
				m_n -= 10, s_n += 60,++t_n;
			else if (m_n>=6){
				if (s - s_n <= 17||t-t_n==1)
					++t_n, s_n += 17;
				else
					m_n -= 6, s_n += 60, t_n += 2;
			}else if (m_n >= 2){
				if (t - t_n <= 2)
					s_n += 17, ++t_n;
				else if (s - s_n <= 34)
					++t_n, s_n += 17;
				else
					m_n -= 2, s_n += 60, t_n += 3;
			}else{
				if (t - t_n <= 6)
					s_n += 17, ++t_n;
				else if (s - s_n <= 102)
					++t_n, s_n += 17;
				else
					t_n += 7, s_n += 120;
			}
		}
		cout << ((s_n >= s) ? ("Yes") : ("No")) << endl << ((s_n >= s) ? t_n : s_n)<

 

 

因为题目没写m,s,t的范围,所以我考虑的是三个数都是int范围内的任意数,也就是说我提交的是一个O(1)的算法,原理是在O(1)的时间内将问题转化成2个子问题,而这2个中的参数都小于某个很小的常数。这个方法,和POJ 1915 Knight Moves https://blog.csdn.net/nameofcsdn/article/details/111918584里面的方法如出一辙。

我的代码:

#include
using namespace std;

int time2(int m,int s)
{
	if(s<=0)return 0;
	if(m>=10)return time2(m-10,s-60)+1;
	int k=time2(m+4,s)+1;
	if(k>(s+16)/17)k=(s+16)/17;	
	return k;
}
int time(int m,int s)
{
	int k=m/10;
	m-=k*10;
	if(s<=k*60)return (s+59)/60;
	if(k)return time(m,s-k*60)+k;
	k=s/120-1;
	if(k>0)return time(m,s-k*120)+k*7;
	return time2(m,s);
}

int len(int m,int t)
{
	if(t==0)return 0;
	int k=m/10;
	m-=k*10;
	if(t0)return len(m,t-k*7)+k*120;
	k=len(m+4,t-1);
	if(k>T;
	while(T--)
	{
		cin>>m>>s>>t;
		ans=time(m,s);
		if(ans<=t)cout<<"Yes\n"<

 

其实函数time和time2是不用分离的,但是为了更好的防止死循环,还是分开写了,直接把time2的代码复制到time里面调用time2地方应该也是正确的。

 

2017年院赛H题 最大异或和

 

题目:

 

最大异或和

 

Description:

小A帮小B解决了在一串数字中找到一段连续的数字和最大这个问题,为了让小B不局限于这么一个简单的问题当中能够举一反三,小A让小B思考同样的道理如何能找到一段连续的数字它们的异或和最大呢?

 

Input:

输入样例组数正整数T(T<=1000)

每组样例输入一个正整数n,表示数字的个数(n<=100000)

接下来一行输入n个正整数a0,a1,....,a(n-1)  (任意ai<2^31)

 

Output:

每组样例输出一个答案表示最大的一段异或和的值

 

Sample Input:

2

3

4 8 5

3

4 8 16

 

Sample Output:

13

28

 

标程:

#include 
#include 
#include 
using namespace std;
#define max(a,b) a>b?a:b
int bit[32];

struct Node{
    Node *lson,*rson;
    Node(){lson=rson=NULL;}
}*root;

void init()
{
    root = new Node(); bit[0] = 1;
    for(int i=1 ; i<32 ; i++) bit[i] = bit[i-1]<<1;
}

void insert(int x)
{
    Node *cur = root;
    for(int i=31 ; i>=0 ; i--){
        if(bit[i]&x){
            if(!cur->rson) cur->rson = new Node();
            cur = cur->rson;
        }else{
            if(!cur->lson) cur->lson = new Node();
            cur = cur->lson;
        }
    }
}

int match(int x)
{
    Node *cur = root;
    int ans = 0;
    for(int i=31 ; i>=0 ; i--){
        if(bit[i]&x){
            if(cur->lson) cur = cur->lson , ans = ans|bit[i];
            else cur = cur->rson;
        }else{
            if(cur->rson) cur = cur->rson , ans = ans|bit[i];
            else cur = cur->lson;
        }
    }
    return ans;
}

int main()
{
    int n , x , cur , T , ans;
    scanf("%d" , &T);
    while(T--){
        init();
        insert(0); ans = cur = 0;
        scanf("%d" , &n);
        for(int i=0 ; i

 

你可能感兴趣的:(new)