概述
算法概述:这个题的关键是“二进制无进位的加法”实际上说的是异或,也就是
二进制中的“同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("%dn", sum - min);
else
printf("NOn");
}
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("%dn", 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("%dn",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.nn", str);
if (palinTag && !mirrorTag)
printf("%s -- is a regular palindrome.nn", str);
if (!palinTag && mirrorTag)
printf("%s -- is a mirrored string.nn", str);
if (palinTag && mirrorTag)
printf("%s -- is a mirrored palindrome.nn", 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("%dn",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("%dn",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--%cn",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("nonen");
}
}
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;
}
最后
以上就是鳗鱼羽毛为你收集整理的东华oj121-129的全部内容,希望文章能够帮你解决东华oj121-129所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复