逃课去吃鸡?!!!,strcpy

Description
xxx 吃鸡成瘾。为此他决定逃课吃鸡!
但是学校有规定,旷课到一定次数,是不给予期末考的资格的。
因此 xxx 决定每门课最多逃两次。
现在告诉你,一个学期有 n 节课程,第 i节课的科目是si 时间为 ti
你需要告诉 xxx 这个学期他逃课吃鸡的最大时间是多少。
Input
第一行给出一个整数(1≤n≤10 000)为该学期课程节数。
接下来n行,第i+1行给出第i节课的科目si 和时间ti, 中间用空格隔开si由小写字母组成1≤|si|≤10
1≤ti≤10 0001若si=sj则认为第i节课和第j节课是同一门课。
Output
输出xxx该学期逃课吃鸡的最大时间。
Sample Input 1
7
english 2
english 1
math 3
english 3
cook 5
eatchicken 10
cook 5
Sample Output 1
28

python.emmmmmm…

开始看见这个题的时候第一反应是python的代码,

n=int(input())
I=[[x for x in input().split()]for i in range(n)]         #用二维列彪接收课程名称和时间,默认字符型
for i in range(n):
    I[i][1]=int(I[i][1])                          #把时间转化成整型
I.sort(key=lambda x:[-x[1]])                   #对二维列表中时间进行从大到小的排序
N=[]                           #建立一个空列表,用来接收已经逃过的课的课程名称啊
a=0
for i in range(n):
    if N.count(I[i][0])<2:               #如果没有逃过两节课呢,就逃!!
        a=a+int(I[i][1])                   
        N.append(I[i][0])
print(a)

当然了,以后每做一道题,都要用c
接下来就是漫长的,探索c的代码。。

#include<stdio.h>
#include<string.h>
void main()
{
    int n;
    scanf("%d",&n);              //输入n一共有n行数据    
    char I[10000][20],z[20];    //因为一维字符型数组中只能存储一个字符,所以要定义一个10000行20列的二维列表
    int L[10000];                    //用I列表接受课程名称,用L列表接受对应的时间
    int i;
    for(i=0;i<n;i++)    //用循环完成输入,开始竟然写成了i==0啊啊啊啊啊啊啊啊啊难受
   {
       scanf("%s %d",I[i],&L[i]);  //字符串输入不需要用&。。注意啊
    }
   int e;
   for(e=0;e<n;e++)     //模拟冒泡排序 ,,对每节课的时间  从大到小排序
   {
       int j;
       for(j=0;j<n-e-1;j++)
       {
           if(L[j]<L[j+1])      //排序知识针对时间啊,但是时间交换的时候,I数组中对应的课程名称也要交换
           {

             strcpy(z,I[j]);           //不知道该怎么说,,啊当时被卡了半天
             strcpy(I[j],I[j+1]);
             strcpy(I[j+1],z);
             int tmp2;
             tmp2=L[j];
             L[j]=L[j+1];
             L[j+1]=tmp2;
           }
       }
   }
   char m[10][20];          //定义一个新列表,用来接受逃了的课的名称
   int a=0;
   int p=0;
   int k,s;
   int b;
   for(k=0;k<n;k++)           //遍历输入的每一节课程
   {
       b=0;
       for(s=0;s<100;s++)       //b表示已经逃过多少次这节课了,就理解成相当于python中的,b=I.count(某某)吧
       {
        if(m[s][2]==I[k][2])b += 1;
       }
       if(b<2)              //如果这节课还没有超过2次逃过,就确定要逃这节课了
       {
           a=a+L[k];
            char Z[20];           //  这4行就是m[p]=I[k];这个意思,但是不能直接这么写啊
           strcpy(Z,m[p]);
            strcpy(m[p],I[k]);
            strcpy(I[k],Z);
           p=p+1;
       }
    }printf("%d\n",a);
}

探索void main 和 int main的区别
void main 和 int main的区别就是有无返回值啊
在int main 可以出现非 int 类型的东西,比如char类型啊
在写代码时,一个函数要么有返回值,要么没有返回值,没有返回值就用void来表示。
main函数同样的,在没有返回值时加个void 。
有的编译器必须main要有返回值 int , 那就写成int main 。
至于什么时候需要哪种写法,不必有这种顾虑,你可以一律都写成 int main ,
然后在方法体中 最后加个return 0 ;就行了,
这样写法没有哪个编译器不通过的吧。

void main 和 int main 在作用上其实没什么区别啊,
只是有的严谨的编译器必须要main有int 返回值而已
,这两种写法跟自定义的函数没任何关系。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值