p1 结构体数组排序
核心在于1.使用结构体,2,使用sort和对应的cmp 3.字符串使用strcmp比大小
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//先创建一个结构体用来存对应的数值
struct E{
char name[100];
int age;
int score;
}Stu[100];
bool cmp(E a,E b){
//比较方式:按成绩排序,如果成绩相同就按名字字母排序
if(a.score!=b.score)
return a.score<b.score;
//再按照字母排序,字符串比大小这里是个问题,使用strcmp a<b 就是<0
int c=strcmp(a.name,b.name);
return c<0;
// return a.name<b.name;
}
int main()
{
int i,n;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%s%d%d",Stu[i].name,&Stu[i].age,&Stu[i].score);//这个格式要注意
sort(Stu,Stu+n,cmp);
for(i=0;i<n;i++)
printf("%s %d %d\n",Stu[i].name,Stu[i].age,Stu[i].score);
}
return 0;
}
p1;这道题的关键是在于,因为给定的值是一个范围的,所以可以直接用一个数组来存对应的数据,即数组的下标就是对应的值,数组的值就是对应的次数。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//创建一个用来成绩次数的数组 成绩是0到100 所以有101个数字
int sc[101];
int main()
{
int i,n;//学生的数目
int score1,score2;//score1是学生成绩,score2是对应的就是统计成绩
//初始化数组
memset(sc,0,sizeof(sc));
while(scanf("%d",&n)!=EOF&&n!=0){
for(i=0;i<n;i++){
scanf("%d",&score1);
sc[score1]++;//对应位置加一
}
scanf("%d",&score2);
printf("%d\n",sc[score2]);
}
}
排版题:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//也就是给定一个n,他的长和高都是n
//所以我的想法是,创建一个n*n的二维数组,然后第一行也就是i等于0的时候 *有i+n个 所以空格是n-(i+n)个
char Str[100][100];
int main()
{
int i,j,n;//输入n个值 所以底是2*n
scanf("%d",&n);
for(i=0;i<n;i++){
//每一行,空格数都是2*n减去(i+n)也就是n-i 都是空格
for(j=n-i-1;j>=0;j--)
Str[i][j]=' ';
for(j=n-i;j<2*n;j++)
Str[i][j]='*';
}
for(i=0;i<n;i++)
for(j=0;j<2*n;j++){
printf("%c",Str[i][j]);
if(j%8==0)
printf("\n");
}
}
查找的问题
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//找数字
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int key;//输入目标值
scanf("%d",&key);
bool flag=false;
for(int i=0;i<n;i++){
if(a[i]==key){
flag=true;
printf("%d\n",i);
}
}
if(!flag)
printf("-1\n");
}
}
结构体数组的查找
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//创建一个学生结构体数组
struct M{
char Str[20];
char name[20];
char sex[3];
int score;//分别是学号,姓名,性别,和分数
}Stu[30];
int main()
{
char S_s[20];//用来输入学生的学号
bool flag=false;
int i;
int n,m;//n个学生,m次查询
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s%s%s%d",Stu[i].Str,Stu[i].name,Stu[i].sex,&Stu[i].score);//别忘记了 输入是%s 也就是字符串数组的时候,是不需要加&
scanf("%d",&m);
while(m--){
scanf("%s",S_s);
for(i=0;i<n;i++){
if(strcmp(Stu[i].Str,S_s)==0){
flag=true;
printf("%s %s %s %d\n",Stu[i].Str,Stu[i].name,Stu[i].sex,Stu[i].score);
}
}
if(!flag)
printf("no answer\n");
}
}
贪心算法:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//贪心 一般都是伴随一个结构体数组
struct M{
int j;
int f;
double rest;//分别代表数量,价值,和性价比
}Mou[100];
//而贪心的话,就是用过性价比来判断的,所以需要写一个比较函数来把性价比最大的找出来
bool cmp(M a,M b){
return a.rest>b.rest;
}
int main()
{
int i,m, n;
while(scanf("%d%d",&m,&n)!=EOF&&m!=-1&&n!=-1){
double sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&Mou[i].j,&Mou[i].f);
Mou[i].rest=1.0*Mou[i].j/Mou[i].f;
}
//再进行排序
sort(Mou,Mou+n,cmp);
//开始判断
for(i=0;i<n;i++){
if(m>=Mou[i].f){//如果比全都的都多的话,那就全都放进去
sum+=Mou[i].j;
m-=Mou[i].f;
}
if(m<Mou[i].f&&m>Mou[i].rest){//买不起全部,但是可以买得起部分
sum+=m*Mou[i].rest;
break;
}
}
printf("%.3f\n",sum);
}
}