东华oj121-129

在这里插入图片描述
在这里插入图片描述
算法概述:这个题的关键是“二进制无进位的加法”实际上说的是异或,也就是
二进制中的“同0异1”的操作。
先判断所有糖果价值的异或(符号为^)是不是0,
如果是0,那么肯定能分成“价值”
相等的两堆(因为两个相同二进制数的异或为0),而如果异或结果为0,那么肖恩
能得到的最大的价值的情况一定是“一堆放那个最小价值的,另一堆放除了最小以外的”
因为如果所有糖果价值的异或为0,那么【最小的糖果价值】和【除了最小之外的其他
糖果】的一定是“价值”(也就是二进制)相等的(因为如果”价值“不等的话所有
糖果的异或不可能是0),所以只需要把最小的那个揪出来把其他的加起来就是肖恩
能得到的最大的价值了
如果是1,那么不可能分成“价值”相等的两堆

#include <bits/stdc++.h>
using namespace std; 
#define MAX_SIZE 12

int main() {
	int i = 0;
	int sum = 0;// 糖果真正价值总和 
	int min = 105; 
	int T = 0, N = 0;
	int C[MAX_SIZE] = {0};
	int xorSum = 0;// 糖果价值的异或和 
	
	scanf("%d", &T);
	while (T--) {
		min = 105, sum = 0;
		
		scanf("%d", &N);
		scanf("%d", &C[0]);
		sum += C[0];
		if (C[0] < min)
			min = C[0];
		xorSum = C[0];
		for (i = 1; i < N; i++) {// 累加糖果价值的异或 
			scanf("%d", &C[i]);
			sum += C[i]; 
			xorSum ^= C[i]; 
			if (C[i] < min)
				min = C[i];// 更新最小 
		}
		
		if (xorSum == 0)// 能分成价值相等的两堆 
			printf("%d\n", sum - min);
		else 
			printf("NO\n");
	}
	
	return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std; 
#define MAX_SIZE 10

int isLoopingNum(int n);

int main() {
	int M = 0, i = 0;
	
	scanf("%d", &M);
	i = M + 1;
	while (1) {
		if (isLoopingNum(i)) {
			printf("%d\n", i);
			break;
		}
		else 
			i++;
	}
	
	return 0;
} 

// 判断循环数
int isLoopingNum(int n) {
	int i = 0, j = 0;
	int num = 0;// 前一个被选中的数 
	int temp = 0;
	int count = 0;// 已选的数字个数 
	int digitAmt = 0;// 一个数包含的数字个数 
	int flag[10] = {0};// flag[i]=1表示数字i在某个数的已经出现 
	int stack[MAX_SIZE] = {0};// 保存一个数的各个位 
	
	while (n) {
		if (flag[n % 10] == 1 || n % 10 == 0)// 有重复数字或者有零,不是循环数 
			return 0;
		
		stack[i++] = n % 10;
		flag[n % 10] = 1;// 标记某个数字已经出现 
		n /= 10; 
	} 
	digitAmt = i; 
	
	for (j = 0; j < i / 2; j++) {// 翻转各位数字 
		temp = stack[j];
		stack[j] = stack[i - j - 1];
		stack[i - j - 1] = temp;
	}
	
	i = 0;
	count++;
	num = stack[i];
	memset(flag, 0, sizeof(flag));// 重置标记 
	flag[num] = 1; 
	while (count < digitAmt) {// 循环取数 
		i = (i + num) % digitAmt;
		count++;
		if (flag[stack[i]] == 1)// 数字已经出现,不是循环数 
			return 0; 
		else {
			num = stack[i];
			flag[num] = 1;// 标记数字 
		}
	}
	if ((i + num) % digitAmt != 0)// 没有回到起点,不是循环数
		return 0;
	return 1; 
} 

在这里插入图片描述

#include <bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#define M 25
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
int n;
int num[M][M];
void solve()
{
    memset(num,-1,sizeof(num));
    int i,j,t=1,t1,t2;
    for(i=1; i<=n+1; ++i)
    {
        int x,k=0;
        if(i&1)     //若为奇数组则首项为n+i,
        {
            x=n+i;
            t1=x;
            num[i][k++]=t1;
            for(j=0; j<i-1; ++j)
            {
                x-=2;
                t1=x;
                num[i][k++]=t1;
            }
            }
        else       //偶数组则首项为n-i+2
        {
            x=n-i+2;
            t2=x;
            num[i][k++]=t2;
            for(j=0; j<i-1; ++j)
            {
                x+=2;
                t2=x;
                num[i][k++]=t2;
            }
        }
    }
    for(i=2;i<=n+1;++i){
        for(j=0;num[i][j]!=-1;++j){
          //  printf("%d",)
            if(t%20==0)printf("%d\n",num[i][j]);
            else
                printf("%d ",num[i][j]);
            t++;
        }
    }
    if(t%20==0)
        printf("\n%d",num[n][0]);
    else
        printf("%d",num[n][0]);
    for(i=n;i>=1;--i)
    {
        for(j=0;num[i][j]!=-1;++j)
        {
            if(i==n&&j==0) continue;
             if(t%20==0)printf("\n%d",num[i][j]);
            else
                printf(" %d",num[i][j]);
            t++;
        }
    }
    printf("\n");
}
int main()
{
   // freopen("xx.in","r",stdin);
  //  freopen("xx.out","w",stdout);
    while(scanf("%d",&n),n)
    {
       // printf("%d=\n",n);
       solve();
    }
    //cout << "Hello world!" << endl;
    return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

#define lowbit(a) (a&(-a))
#define _mid(a,b) ((a+b)/2)
#define _mem(a,b) memset(a,0,(b+3)<<2)
#define fori(a) for(int i=0;i<a;i++)
#define forj(a) for(int j=0;j<a;j++)
#define ifor(a) for(int i=1;i<=a;i++)
#define jfor(a) for(int j=1;j<=a;j++)
#define mem(a,b) memset(a,b,sizeof(a))
#define IN freopen("in.txt","r",stdin)
#define OUT freopen("out.txt","w",stdout)
#define IO do{\
    ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);}while(0)
#define mp(a,b) make_pair(a,b)
#define debug(a) cout <<(a) << endl
using namespace std;
typedef long long ll;
const int maxn =  2*1e5+9;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f;
const double EPS = 1e-7;
const double Pi = acos(-1);
const int MOD = 1e9+7;
int c[maxn];
pair <int,int>buf;
map< pair<int,int>,int>q;   //标记数对是否出现,如果a/b为纯循环小数的话,<a,b>这个数对一定会反复出现

int getnum(int a,int b,int flag) {      //flag = 1时计算循环部分,否则计算非循环部分
    mem(c,0);
    q.clear();
    int cnt = 0;
    while(cnt <= 1e5) {             //迭代相除      
        buf.first = a;
        buf.second = b;
        if(q[buf]) {            //如果数对用过,则证明从这里开始循环了
            if(flag)
                return cnt-1;
            break;
        }
        q[buf] = cnt;
        /*相除*************/
        if(a > b)
            c[cnt++] = a/b,a %= b;
        else if(a==b) {
            buf.first = 0;
            c[cnt++] = 1;
            return cnt;
        } else
            c[cnt++] = 0;
        a *= 10;
        /****************/
    }
    return q[buf];
}

int jugecnt(int a){int ans = 0;while(a) ans++,a/=10;return ans?ans:1;}  //判断数组内存的数字位数
int main() {
    int a,b;
    int cnt = 0;
    bool flag = false;
    cin >>a >> b;
    int cntline = 0;            //记录每行输出了几个字符

    int e = getnum(a,b,0);      //算出不循环部分,然后剩下的两个数相除一定是循环小数
    fori(e) {
        if(i==1)
            cout <<".",cntline++;
        cout << c[i],cntline+=jugecnt(c[i]);
    }
    if(e >= 2)
        flag = true;
    if(e <= 1)
        cout <<".",cntline++;


    e = getnum(buf.first,buf.second,1); // 计算循环部分
    if(!(e<=1&&c[e-1]==0)){
        cout <<"(",cntline++;
        fori(e){
            cout << c[i],cntline+=jugecnt(c[i]);
            if(cntline ==76){
                cout << endl;
                cntline = 0;
            }
        }
        cout <<")",cntline++;
    }
    else if(!flag)
        fori(e){
            cout << c[i],cntline++;
            if(cntline ==76){
                cout << endl;
                cntline = 0;
            }
        }
    cout <<endl;
    return 0;
}

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define CHAR_MAX_SIZE 25

// 每个字母和数字对应的镜面字母(如果没有就用空格表示) 
char charMirror[] = "A   3  HIL JM O   2TUVWXY5", digitMirror[] = "O1SE Z  8 "; 
int isPalin(char str[]);
int isMirror(char str[]); 

int main() {
	char str[CHAR_MAX_SIZE] = "";
	int palinTag = 0, mirrorTag = 0;// 回文、镜面回文标记 

	while (scanf("%s", str) != EOF) {// 测试用例NOTAPALINDROME结果不对 
		palinTag = isPalin(str);
		mirrorTag = isMirror(str);
		
		if (!palinTag && !mirrorTag) 
			printf("%s -- is not a palindrome.\n\n", str);
		if (palinTag && !mirrorTag) 
			printf("%s -- is a regular palindrome.\n\n", str);
		if (!palinTag && mirrorTag) 
			printf("%s -- is a mirrored string.\n\n", str);
		if (palinTag && mirrorTag) 
			printf("%s -- is a mirrored palindrome.\n\n", str);
	} 	
	
	return 0;
}

// 判断回文字符串
int isPalin(char str[]) {
	int i = 0;
	char strCopy[CHAR_MAX_SIZE] = "";
	strcpy(strCopy, str); 
	int len = strlen(strCopy); 
		
	for (i = 0; i < len / 2; i++) {
		if (strCopy[i] != strCopy[len - i - 1])
			return 0;
	}
	
	return 1;
}

// 判断镜面回文
// 只要处于对称位置的两个字符互为镜面字符就可以了 
int isMirror(char str[]) {
	int i = 0;
	int len = strlen(str);
	for (i = 0; i < len / 2; i++) {
		if (str[i] >= 'A' && str[i] <= 'Z') {// 当前字符为字母
			if (str[len - i - 1] != charMirror[str[i] - 'A'])
				return 0;
		} 
		else {// 当前字符为数字
			if (str[len - i - 1] == '0' && 'O' != digitMirror[str[i] - '0'])
				return 0;
			if (str[len - i - 1] != digitMirror[str[i] - '0'])
				return 0;
		} 
	}
	
	return 1; 
} 

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

void DFS(int sum, int index, int nowk);
int k,n,type=0,num[100];
int main()
{
	int i;

	 while (scanf("%d",&n) != EOF)
    {
		for (i = 0; i < n; i++)
			 scanf("%d", &num[i]);

        type=0;
         for(k=1;k<=n;k++)
         {
               DFS(0, 0, 0);
         }

             printf("%d\n",type);


    }
return 0;

}

void DFS(int sum, int index, int nowk)
{

    if(nowk==k&&sum%11==0&&sum!=0)
    {
        type++;
        return ;
    }
    if(index==n||nowk>k)
        return ;//死胡同 

	DFS(sum , index + 1,nowk);  //不选择第index件物品
	DFS(sum+num[index], index + 1, nowk+1); //选择第index件物品     
} 

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

int purePrimes[10][100];// 存放所有的纯素数,如nums[1][2]表示的是一维的第二个纯素数   
int count_number[100];
int pure_prime(int number){
		if(number==1)
		return 0;
	int i;
	for(i=2;i<=number/2;i++)
		if(number%i==0)
			return 0;
	if(i>number/2)
		return 1;
}
//x代表纯素数 dimen代表维数  count_number代表当前维数第几个 
void dfs(int x,int dimen,int number)
{
	if(dimen>8)
		return ;
	purePrimes[dimen][number]=x;
	int i;
	for(i=1;i<10;i++) //if 10*x+i是素数  那么舍去尾数i 则10*x+1必是纯素数 
	{
			if(pure_prime(10*x+i))
			dfs(10*x+i,dimen+1,++count_number[dimen+1]);
		}
}
int main(){
		int N;
		scanf("%d",&N);
		int i;
		//count_number[100]={0};
			for(i=2;i<10;i++)
		{	if(pure_prime(i))	// 先将所有的纯素数求出来 
			dfs(i,1,++count_number[1]);
			} 
		while(N--)
		{	
			int T;
			scanf("%d",&T);	//不能提前输入 否则会超时	
		for( i=1;i<=count_number[T];i++)
			printf("%d\n",purePrimes[T][i]);
	}
	return 0;
} 

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

int step=0;
int m=0;
int flag=0;
void move(int id,char X,char Y){
	step++;
	if(step==m){
		printf("%c--%c\n",X,Y);
		flag=1;
	}
}
void hanoi(int n,char A,char B,char C){
	if(n==0)return;
	hanoi(n-1,A,C,B);
	move(n,A,C);
	hanoi(n-1,B,A,C);
	
}
 
int main(){
	int N;
	while(scanf("%d %d",&N,&m)!=EOF){
		flag=0;step=0;
		hanoi(N,'A','B','C');
		if(!flag){
			printf("none\n");
		}
	}
	return 0;
}
 

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

char str[55][1000];

int cmp(const void *a ,const void *b)
{
    char p1[1000],p2[1000]; // 比賽中因為數組開小了,而...... 
    strcpy(p1,(char *)a);   // 做臨時存儲,這是由於數組即指針常量的關係 
    strcpy(p2,(char *)b);
    strcat(p1,(char *)b);   // 不要在 a,b 上直接拼接啊。 
    strcat(p2,(char *)a);
    return strcmp(p2,p1);
}

int main()
{
    int N;
    while(scanf("%d",&N),N)
    {
        for(int i=0;i<N;++i)
            scanf("%s",str[i]);
        qsort(str,N,sizeof(str[0]),cmp);
        for(int i=0;i<N;++i)
            printf("%s",str[i]);
        printf("\n");
    }
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值