acm

逃出七仙女的天罗地网后,七仙女的师兄知道师妹们惨败,气急败坏,立马出山,非要和迪神一决高下,正巧得知这时迪神马上就要到桃花源了,于是抢先一步来到桃花源,布下决死阵,迪神能否逃过这一劫顺利归隐呢?

决死阵机关重重,有深渊,迷雾林,迪神无法度过深渊和迷雾林,但巧合的是,决死阵中也有无数传送门。用“.“表示通路,”#“表示深渊,空格表示迷雾林, “*”表示传送门,传送门就是能直接由“*”到后面任何一个“*”,如果只有一个传送门,则不能被传送,但能正常通过此门。迷雾林不会在一开始和最后出现。

那么列出决死阵信息,判断迪神能否通过此阵。

输入:

第一行输入测试样例数t(0<t<=10000):

接下来t行每行输入一种决死阵信息。

输出:

如果迪神能通过,输出“YES”;

否则输出“NO”。
a=int(input())
s=[]
for i in range(a):
    s.append(input())
print(s)
z=[]
for j in s:
    print(j)
    valid_key=0
    unvalid_key=0
    while valid_key<len(j) and unvalid_key<len(j):
        if j[valid_key]=='.':
            valid_key=valid_key+1
        elif j[valid_key]=='*':
            x=[]
            for k in range(len(j)):
                if j[k]=='*':
                    x.append(k)
            y=max(x)+1
            valid_key=y
        elif j[valid_key]=='#' or j[valid_key]==' ':
            valid_key=valid_key
            unvalid_key=unvalid_key+1
    if valid_key==len(j):
        m='YES'
    else:
        m='NO'
    z.append(m)
for l in z:
    print(l)
薛神靠着师尊的亡命符终于度过了太阳海,来到了太阳岛,天山雪莲就在太阳岛中间上的天山冰宫中,太阳岛上设置无数禁制,不能动用法力,只能一步步走过去。已知通往天山冰宫的路是一条无间道崎岖的呈“W ”型。

输入

给你任意一个数字n(2<=n<=30)

输出

对应形状;

样例输入复制
2
3
样例输出复制
* * *
 * *
*   *   *
 * * * *
  *   *

while True:
    a=int(input())
    if a==2:
        print('* * *')
        print(' * * ')
    elif a>=3:
        for i in range(1,a+1):
            if i==1:
                print('*{0}*{0}*'.format(' '*(1+(a-2)*2)))
            elif i==a:
                print('{0}*{1}*{0}'.format(' '*(a-1),' '*(1+(a-2)*2)))
            else:
                print('{0}*{1}*{2}*{1}*{0}'.format(' '*(i-1),' '*(1+(a-2-(i-1))*2),' '*(1+(i-2)*2)))
给出一个可爱的字符串,试判断它是否是回文串(回文串是指翻转后和原串完全相同的串,同一字母的大小写视为不同的字符)。如果是回文串,先输出YES,再输出该字符串中含有多少个不同的字符(两者用一个空格间隔);如果不是,先输出NO,并改变尽量少的字符使其变成回文串,再输出最少的改变字符的个数(格式同上)。

输入:

首先输入一个正整数T(T<=500),表示测试的组数。接下来的T行,每一行都包含一个字符串,字符串的长度不超过1000,且不包含空格符。

输出:

对于每组测试数据,按照描述的要求输出结果。

样例输入复制
2
Abc12321cbA
MyQQNumberIs357554710
样例输出复制
Case #1:YES 6
Case #2:NO 10
a=int(input())
s=[]
for i in range(a):
    s.append(input())
x=[]
y=0
for j in s:
    if list(j)==list(reversed(j)):
        m='YES'
        n = len(set(list(j)))
    else:
        m='NO'
        for k in range(len(list(j))):
            if list(j)[k]!=list(j)[-(k+1)]:
                y=y+1
        n=y//2
    x.append(m)
    x.append(n)
for l in range(0,len(x)):
    print('Case #{0}:{1} {2}'.format(l,x[2*l],x[2*l+1]))
王大钉喜欢喝酒,存货都喝完了,他就去楼下买,正好楼下的商店为了响应学校的 ACM 校赛推出了优惠活动:凡是在本店买的啤酒,喝完以后 33 个空瓶可以换一瓶,44 个瓶盖也可以换一瓶酒。

王大钉觉得太合算了,决定多买,现在他手里的钱可以买 NN 瓶酒,但是他算不出来,通过活动兑换他一共可以喝到多少瓶?他很难过,你能帮他计算一下他能喝的酒的数量吗?

输入格式:

输入第一行是一个正整数 TT,代表测试样例的数量,0 < T \leq 1000<T≤100。

接下来有 TT 行,每行输入一个整数 NN,代表一开始所购买的啤酒数量,0 \leq N < 10000000≤N<1000000。

输出格式:

对应每组数据,输出一个结果,即通过活动兑换后,总共能喝到的啤酒数。

样例输入复制
3
1
2
10
样例输出复制
1
2
22
a=int(input())
s=[]
for i in range(a):
    s.append(int(input()))
z=[]
for j in s:
    lid=bottle=B=j
    while lid>=4 or bottle>=3:
        if lid>=4:
            lid=lid-4
            lid=lid+1
            bottle=bottle+1
            B=B+1
        if bottle>=3:
            bottle=bottle-3
            bottle=bottle+1
            lid=lid+1
            B=B+1
    z.append(B)
for j  in z:
    print(j)
小蒜蒜最近学习了菱形(四边都相等的四边形)。现在她给了你一个字符,希望你能用它构造一个对角线长 55 个字符,倾斜放置的菱形。输入格式输入只有一行,包含一个字符。输出格式该字符构成的菱形。输出时每行末尾的多余空格,不影响答案正确性样例输入复制*样例输出复制  * ******** ***  *
a=str(input())print('''  %s   %s%s%s %s%s%s%s%s %s%s%s  %s  '''%(a,a,a,a,a,a,a,a,a,a,a,a,a))
天才程序员菜哭武去超市买东西,买了不超过一百块的东西。收银员想尽量用少的纸币来找钱。纸币面额分为50 20 10 5 1 五种。请在知道要找多少钱n给菜哭武的情况下,输出纸币数量最少的方案。 1<=n<=99;输入有多组数据  1<=n<=99;输出对于每种数量不为0的纸币,输出他们的面值*数量,再加起来输出样例输入 Copy2532样例输出 Copy20*1+5*120*1+10*1+1*2
while True:    s=[]    a=int(input())    for i in range(10):        for j in range(10):            for k in range(10):                for l in range(10):                    for m in range(10):                        if 50*i+20*j+10*k+5*l+1*m==a:                            s.extend([[i,j,k,l,m]])    b={}    for x in range(len(s)):        b[x]=sum(s[x])    c=min(b.values())    for y in range(len(b)):        if b[y]==c:            d=y    o=''    e=[50,20,10,5,1]    for z in range(5):        if s[d][z]!=0:            o=o+str(e[z])+'*'+str(s[d][z])+'+'        else:            o=o+''    print(o[0:len(o)-1])
天才程序员菜哭武和张老师有一天到一个城市旅游,旅途中菜哭武觉得无聊就想和张老师玩一个游戏。菜哭武有n个石子,每个石子都标有1到n之间的数,且各不相同,一开始他们会随机从这堆石子选一个石子放置到一个集合中,张老师选的数是a,菜哭武选的是b(a和b不相同)。接下来菜哭武和张老师轮流按照如下规则拿走一个石子:当石子x能被拿走时,当且仅当集合存在y和z,满足x等于y+z或者y-z,当x被拿走时,把它放到集合中。谁完成最后一轮操作时,谁获胜。张老师总是先手,于是张老师就好奇当决定好a和b时,他是否总是能获胜,你能帮助一下张老师吗?输入第一行一个整数T(1≤T≤500),表示共有T组测试数据对于每组测试数据,第一行三个整数n(2≤n≤20000)、a和b(1≤a,b≤n,a≠b)输出若张老师能获胜输出Yes,反之No样例输入 Copy162 1 23 1 367 1 2100 1 28 6 89 6 810 6 811 6 812 6 813 6 814 6 815 6 816 6 81314 6 81994 1 131994 7 12样例输出 CopyNoYesYesNoNoNoYesYesNoNoYesYesNoYesNoNo
T=int(input())s=[]L=[]L1=[]for i in range(T):    n,a,b=map(int,input().split())    list1=list(range(1,n+1))    L.append(a)    L.append(b)    list1.remove(a)    list1.remove(b)    x=0    while len(list1)>0:        for j in L:            for k in L:                L1.append(j+k)                L1.append(j-k)                L1.append(k-j)        for l in L1:            if l in list1:                L.append(l)                list1.remove(l)                x=x+1if x%2!=0:    print('YES')else:    print('NO')
已知多项式方程:a0+a1x+a2x2+...+anxn=0求这个方程在[1,m]内的整数解(n和m均为正整数)。输入格式第一行包含2个整数n、m,每两个整数之间用一个空格隔开。接下来的n+1行每行包含一个整数,依次为a0,a1,a2,...,an。输出格式第一行输出方程在[1,m]内的整数解的个数。接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解。样例一input2 101-21output11样例二input2 102-31output212样例三input2 10132output0
n,m=map(int,input().split())o=['1']p=[]s=''z=[]for i in range(1,n+1):    o.append('x**'+str(i))for j in range(n+1):    p.append(str(input()))for k in range(n+1):    s=s+p[k]+'*'+o[k]+'+'s=s[0:len(s)-1]for x in range(1,m+1):    if eval(s)==0:        z.append(x)print(len(z))for y in z:    print(y)
用数字 1,2,3,4,...,n\times n1,2,3,4,...,n×n 这 n^2n 2  个数蛇形填充规模为 n^2n 2  的方阵。蛇形填充方法为:对于每一条左下-右上的斜线,从左上到右下依次编号 1,2,\ldots,2n-11,2,…,2n−1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。比如 n=4n=4 时,方阵填充为如下形式:11  2  6  723  5  8  1334  9  12 14410 11 15 16输入格式输入一个不大于 1010 的正整数 nn,表示方阵的行数。输出格式输出该方阵,相邻两个元素之间用单个空格间隔。输出时每行末尾的多余空格,不影响答案正确性样例输入复制4样例输出复制1 2 6 73 5 8 134 9 12 1410 11 15 16
n=int(input())s=[]m=[]for i in range(n):    m.extend([[]])    for j in range(n):        m[i].extend([[]])for x in range(2*n-1):    s.extend([[]])for i in range(2,2*n+1):    for j in range(1,n+1):        for k in range(1,n+1):            if j+k==i:                s[i-2].append((j,k))for y in range(1,len(s)):    if y%2!=0:        s[y]=sorted(s[y],reverse=True,key=lambda x:x[0])z=1for c in range(len(s)):    for d in range(len(s[c])):        a,b=s[c][d][0],s[c][d][1]        m[a-1][b-1].append(z)        z=z+1f=0for i in range(n):    for j in range(n):        if f!=n-1:            print(m[j][i][0],end=' ')            f=f+1        elif f==n-1:            print(m[j][i][0],end='\n')            f=0
DrinkTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 756    Accepted Submission(s): 366Problem Description我们有 n 种不同的饮料,每种饮料有无限多瓶,第 i 种饮料一瓶提供 x[i] 毫升的水分,包含 y[i] 卡路里。现在我们需要选择一种饮料一直喝,直到补充了至少 m 毫升的水分,我们想使得摄入的卡路里总和最小。请求出这个最小值。一旦打开一瓶饮料,就一定要喝完。 Input第一行一个整数 test(1≤test≤100) 表示数据组数。对于每组数据,第一行两个整数 n,m(1≤n≤100,1≤m≤10000)。接下来 n 行,每行两个整数 x[i],y[i](1≤x[i],y[i]≤100)。 Output对于每组数据,一行一个整数表示答案。 Sample Input21 103 32 103 32 1 Sample Output125 Source2020 年百度之星·程序设计大赛 - 初赛一 Recommendliuyiding
void main(){	int x,i;	scanf("%d",&x);	int num[x];	for(i=0;i<x;i++)        num[i]=p();    for(i=0;i<x;i++)        printf("%d\n",num[i]);}int p(){    int n,m;	scanf("%d %d",&n,&m);	int i,j,a,b,sum1,sum2;	int drink=10000;	for(i=0;i<n;i++)    {        sum1=0;        sum2=0;        scanf("%d %d",&a,&b);        while(sum1<m)        {          sum2=sum2+b;          sum1=sum1+a;        }        if(drink>sum2)            drink=sum2;    }    return drink;}
GPATime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 681    Accepted Submission(s): 303Problem Description小沃沃一共参加了 4 门考试,每门考试满分 100 分,最低 0 分,分数是整数。给定四门考试的总分,请问在最优情况下,四门课绩点的和最高是多少?分数与绩点之间的对应关系如下:95~100 4.390~94 4.085~89 3.780~84 3.375~79 3.070~74 2.767~69 2.365~66 2.062~64 1.760~61 1.00~59 0 Input第一行一个正整数 test(1≤test≤401) 表示数据组数。接下来 test 行,每行一个正整数 x 表示四门考试的总分 (0≤x≤400)。 Output对于每组数据,一行一个数表示答案。答案保留一位小数。 Sample Input20400 Sample Output0.017.2 Source2020 年百度之星·程序设计大赛 - 初赛一 Recommendliuyiding
float p();float score(int x);void main(){	int m;	scanf("%d",&m);	int i;	float num[m];	for(i=0;i<m;i++)        num[i]=p();    for(i=0;i<m;i++)        printf("%f\n",num[i]);}float p(){    int x,i,j,k,l;	float max=0;	float s;	scanf("%d",&x);	for(i=0;i<=100;i++)    {        for(j=0;j<=100;j++)        {            for(k=0;k<=100;k++)            {                for(l=0;l<=100;l++)                {                    s=score(i)+score(j)+score(k)+score(l);                    if((i+j+k+l==x)&&max<s)                    {                        max=s;                    }                }            }        }    }    return max;}float score(int x){    float t;    switch(x)    {    case 60:    case 61:t=1.0;break;    case 62:    case 63:        case 64:t=1.7;break;        case 65:        case 66:t=2.0;break;        case 67:        case 68:        case 69:t=2.3;break;        case 70:        case 71:        case 72:        case 73:        case 74:t=2.7;break;        case 75:        case 76:        case 77:        case 78:        case 79:t=3.0;break;        case 80:        case 81:        case 82:        case 83:        case 84:t=3.3;break;        case 85:        case 86:        case 87:        case 88:        case 89:t=3.7;break;        case 90:        case 91:        case 92:        case 93:        case 94:t=4.0;break;        case 95:        case 96:        case 97:        case 98:        case 99:        case 100:t=4.3;break;        default:t=0;break;    }    return t;}
PokerTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 877    Accepted Submission(s): 344Problem Description小沃沃在玩一个有趣的游戏。初始他有 n 块钱,每一轮他需要投入至少 m 块钱,系统会拿走其中 p% 的钱,并把剩下的钱还给他。请问在最优情况下,小沃沃最多可以玩多少轮?假设当前一轮小沃沃投入了 x 块钱,那么他可以收回 ⌊x×(1−p%)⌋ 块钱,其中 ⌊a⌋ 表示 a 取下整。小沃沃每一轮投入的钱不能超过他现在拥有的钱。每一轮投入的钱必须为整数。 Input第一行一个正整数 test(1≤test≤100000) 表示数据组数。对于每组数据,一行三个整数 n,m,p(1≤n≤100000,1≤m≤1000,1≤p≤100)。 Output对每组数据输出一行一个整数表示答案。 Sample Input210 2 5010 2 100 Sample Output95 Source2020 年百度之星·程序设计大赛 - 初赛二 Recommendheyang
void main(){    int x,i;    scanf("%d",&x);    int num[x];    for(i=0;i<x;i++)        num[i]=p();    for(i=0;i<x;i++)        printf("%d\n",num[i]);}int p(){    int n,m,s=0;    float p;    scanf("%d %d %f",&n,&m,&p);    p=p/100;    while(n>=m)    {        n=n-m+(int)m*(1-p);        s++;    }    return s;}

191. 位1的个数

难度简单362

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3

示例 1:

输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000输出:1解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101输出:31解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
int hammingWeight(uint32_t n) {    int i,sum=0;     for(i=0;i<32;i++)    {        sum=sum+(n>>i)%2;    }    return sum;}

189. 旋转数组

难度中等1020

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

进阶:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释: 向右旋转 1 步: [99,-1,-100,3]向右旋转 2 步: [3,99,-1,-100]
void rotate(int* nums, int numsSize, int k){    int i,j;    int nums1[numsSize];    for(i=0;i<numsSize;i++)    {        nums1[(i+k)%numsSize]=nums[i];    }    for(i=0;i<numsSize;i++)        nums[i]=nums1[i];}

1.6.1 先从简单题开始

三角形

有n根棍子,棍子 i的长度为 ai。想要从中选出 3 根棍子组成周长尽可能长的三角形。请输

出最大的周长,若无法组成三角形则输出 0。

输出

12 ( 选择3、4、5时)

输入

4

a = {4, 5, 10, 20}

输出

0 ( 无论怎么选都无法组成三角形)

O(n^3):

void main(){    int n,i,max=0,x,y,z;    n=5;//    scanf("%d",&n);    int num[5]={2,3,4,5,10};//    for(i=0;i<n;i++)//    {//        scanf("%d",&num[i]);//    }    for(x=0;x<n;x++)    {        for(y=0;y<n;y++)        {            for(z=0;z<n;z++)            {                if(num[x]+num[y]>num[z]&&num[x]+num[z]>num[y]&&num[y]+num[z]>num[x]&&fabs(num[x]-num[y])<num[z]&&fabs(num[x]-num[z])<num[y]&&fabs(num[y]-num[z])<num[x]&&x!=y&&x!=z&&y!=z)                {                    if(num[x]+num[y]+num[z]>max)                        max=num[x]+num[y]+num[z];                }            }        }    }    if(max==0)        printf("0");    else        printf("%d\n",max);}

O(nlogn):

void main(){    int n,i,j,temp,max=0;    scanf("%d",&n);    int num[n];    for(i=0;i<n;i++)        scanf("%d",&num[i]);    /*先排序*/    for(i=0;i<n;i++)    {        for(j=i+1;j<n;j++)        {            if(num[i]>num[j])            {                temp=num[i];                num[i]=num[j];                num[j]=temp;            }        }    }    /*再进行遍历选最大组合*/    for(i=n-1;i>=2;i--)//倒序遍历    {        if(num[n-2]+num[n-1]>num[n])        {            max=num[n-2]+num[n-1]+num[n];//遇到的第一组则为最长组合        }    }}
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。     偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。     偷窃到的最高金额 = 2 + 9 + 1 = 12 。
int main(){    int nums[7]={4,1,1,1,1,1,3};    printf("%d",L(nums,7));}int L(int *nums,int numsSize){    if(numsSize==0)        return 0;    int dp[numsSize+1];    dp[0]=0,dp[1]=nums[0];    int k;    for(k=2;k<=numsSize;k++)    {        dp[k]=max(dp[k-1],dp[k-2]+nums[k-1]);    }    return dp[numsSize];}int max(int m,int n){    return m>n?m:n;}
输入一个整数n,代表要测试的组数,然后输入n个数,计算每个数都能由多少种两个质数组成的情况,例如30可以由11+19构成和13+17构成,所以对于30来说有两种组成情况。样式输入:2-----------------------------------------------------------------------------------------530-----------------------------------------------------------------------------------------12
n=int(input())#输入数据的组数num=[]#建立一个数组来存储输入的数据for i in range(n):    num.append(int(input()))#建立一个num数组里最大的数的因子数组yin_num=[]for i in range(2,max(num)):    flag=1    for j in range(2,i):        if i%j==0:            flag=0    if flag==1:        yin_num.append(i)print(yin_num)#建立方法数组kind_num=[]#将num数组中存储的数字一个个取出来for i in num:    #s代表方法数    s=0    for j in yin_num:        for k in yin_num:            if j+k==i and j==k:                s=s+2            if j+k==i and j!=k:                s=s+1    kind_num.append(s/2)for i in range(n):    print(int(kind_num[i]))
输入一个数n和一个数s,则有三个数a1,a2,a3(0<=a1,a2,a3<=n),求有多少种情况。例如:输入 2 2则a1,a2,a3可分别等于 1 1 0、1 0 1、0 1 1、0 0 2、2 0 0、0 2 0所以输出 6
n,s=list(map(int,input()))k=[] # 首先建立一个数组count=0 # 计数器for i in range(n+1): # 将0~n的数放进去    k.append(i)for i in range(n+1):    for j in range(n+1):        if s-i-j in k: # 只需遍历前两个数并判断第三个数在不在数组里即可,这样就可以少遍历一次循环            count=count+1print(count)
小易有堆积木,第堆积木有块。小易还拥有一个容量无限的背包。一开始小易站在第一堆积木旁边。每次小易可以选择进行下列三种操作中的一种:从背包里掏出一块积木(如果有的话)放到当前这一堆里从当前这一堆积木里掏出一块塞到背包里(如果当前积木堆不为空的话)从当前这一堆走到下一堆。一开始小易的背包里有块积木。小易希望把这些个积木变成严格递增的(即。小易希望知道这是否有可能能完成。(所有操作结束后不需要保证背包里没有积木了,可以有积木堆为空)。输入格式第一行数据组数对于每组数据,第一行数字,接下来一行个数字表示.输出格式对于每组数据输出一行,输出结果或样例样例输入 115 32 2 3 3 1样例输出 1YES样例输入 215 20 0 1 2 1样例输出 2NO
T=int(input()) # 测试组数result=[]# 思路:最起码要将积木排成 0、1、2..........n-1,看看前面多的可以拿多少进书包,后面要拿多少出来放到积木堆中for i in range(T):    n,m=list(map(int,input().split()))    jimu=list(map(int,input().split())) # 比如 jimu=[2,2,3,3,1]    for j in range(len(jimu)):        jimu[j]=jimu[j]-j # jimu=[2,1,1,0,-3] ,记录着积木的多出或缺少的积木数    if all(sum(jimu[:i])+m>=0 for i in range(1,n+1)): # 判断前i项和(0<=i<=n-1)与书包中积木数的和是否大于等于0来判断前面拿出的和书包中的是否足够放到后面缺少中去        result.append("YES")    else:        result.append("NO")for i in result:    print(i)
题目描述一个实验室有N个放化学品的试管,排列在一条直线上。如果连续M个试管中放入药品,则会发生爆炸,于是,在某些试管中可能不放药品。任务:对于给定的N和M,求不发生爆炸的放置药品的方案总数输入第一行是一个正整数L,代表输入数据的组数接下来L行,每行有两个正整数N,M( 1<N<32,2≤M≤5)输出输出L行,每行只有一个正整数S,表示对应输入数据的方案总数。样例输入24 33 2样例输出135提示
def jiecheng(num):    s=1    for i in range(1,num+1):        s=s*i    return sdef Cmn(m,n):    return jiecheng(m)/jiecheng(n)/jiecheng(m-n)def count(n,m):    s=Cmn(n,m)-(n-m+1)    m=m-1    while m:        s=s+Cmn(n,m)        m=m-1    return stest=int(input())result=[]while test:    n,m=map(int,input().split())    result.append(count(n,m)+1)    test=test-1for i in result:    print(i)
问题 G时间限制: 0Sec 内存限制: 128MB 提交: 2 解决: 1题目描述Mrs.Chen是一个很认真很称职的语文老师  ...... 所以,当她看到学生作文里的人物关系描述得非常的麻烦的时候,她非常生气,于是宣布:凡是作文里有冗余关系的,一率罚抄出师表10次...同学们非常的恐惧,于是,每当他们写出一篇作文,都要拿来你这个语文兼OI天才这里,问你有没有冗余的关系  ......  时间一久,你也烦了,于是就想写个程序来代劳  ... 现在这里有一篇作文,有n句描述人物关系的句子,描述了n个人的关系 每条句子的定义是这样的 X  Y 它的意思是:X认识Y  Y也认识X 现在要你求出文中冗余关系的数目. 注意:  假如A认识B,B认识C,则A也认识C 冗余关系的定义是指  :  即使没有这条关系,原图的所有关系照样成立.输入第一行,两个整数,表示句子数量(n),表示人数(m)。 接下来n行,每行两个数,意义在描述里已经说了. 输出一个整数,表示冗余关系的数目.样例输入3 31 21 32 3样例输出1
#include <stdio.h>#include <string.h>const int maxn=100;int init(int s[]){    int i;    for(i=1;i<=maxn;i++)    {        s[i]=i; // 令自己属于自己    }}int find(int s[],int x){    if(x!=s[x]) s[x]=find(s,s[x]);    return s[x];}void union_set(int s[],int x,int y){    x=find(s,x);    y=find(s,y);    if(x!=y) s[x]=s[y];}int main(){    // 并查集    int fa[maxn];    int n,m;    scanf("%d %d",&n,&m);    init(fa); // 先进行初始化    int count=0; // 定义计数器    while(n--)    {        int x,y;        scanf("%d %d",&x,&y);        if(find(fa,x)==find(fa,y)) // if 已经存在两者关系时            count++;        else // if not,union them            union_set(fa,x,y);    }    printf("%d",count);}
题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个 mm 行 nn 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标 (1,1)(1,1),小轩坐在矩阵的右下角,坐标 (m,n)(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用 00 表示),可以用一个 [0,100][0,100] 内的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。现在,请你帮助小渊和小轩找到这样的两条路径。输入格式第一行有两个用空格隔开的整数 mm 和 nn,表示班里有 mm 行 nn 列。接下来的 mm 行是一个 m \times nm×n 的矩阵,矩阵中第 ii 行 jj 列的整数表示坐在第 ii 行 jj 列的学生的好心程度。每行的 nn 个整数之间用空格隔开。输出格式输出文件共一行一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。输入输出样例输入 #1复制3 30 3 92 8 55 7 0输出 #1复制34
#include <stdio.h>#include <string.h>const int maxn=55;int max(int m,int n){    return m>n?m:n;}int main(){    // static plan    // dp[i][j][m][n]=max(dp[i-1][j][m-1][n],dp[i-1][j][m][n-1],dp[i][j-1][m-1][n],dp[i][j-1][m][n-1])+num[i][j]+num[m][n]    // make (i,j)=(i+1,j+1)    int n;    scanf("%d",&n);    int num[maxn][maxn],i,j,x,y;    int dp[maxn][maxn][maxn][maxn];    // initiate    for(i=0;i<=n;i++)        for(j=0;j<=n;j++)            num[i][j]=0;    while(1)    {        int a,b,c;        scanf("%d %d %d",&a,&b,&c);        if(a==0&&b==0&&c==0)            break;        num[a][b]=c;    }    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            for(x=1;x<=n;x++)                for(y=1;y<=n;y++)                {                    dp[i][j][x][y]=max(dp[i-1][j][x-1][y],max(dp[i-1][j][x][y-1],max(dp[i][j-1][x-1][y],dp[i][j-1][x][y-1])));			        dp[i][j][x][y]+=((i==x&&j==y)?num[i][j]:(num[i][j]+num[x][y]));                }    printf("%d",dp[n][n][n][n]);}
题目描述小易给定一个到的排列,希望你能求出这个序列中所有逆序对的距离和。下标的距离为,逆序对是指序列中一对下标满足且 .输入格式第一行数字表示排列长度接下来一行个数字表示这个排列输出格式一行一个数字表示答案样例样例输入5  1 3 4 2 5样例输出3
n = int(input())#输入排列长度nnum = list(map(int, input().split()))#输入第二行的n个数字,用空格隔开#split(对字符串操作)默认以空格来分割#分割好的序列input().split()全部进行函数int操作,str型都变为int型#由于python3.x返回迭代器,所以加list()函数将迭代器转化为列表ans = 0acc = 0for i, x in enumerate(num):    m = i + 1    acc += x    #acc=acc+x    g = (m + 1) * m / 2    ans += (acc - g)    #ans=ans+(acc-g)print(int(ans))
posted @ 2021-08-28 15:51  jimore  阅读(123)  评论(0编辑  收藏  举报