传送门
P-0108 拼数字
//xdoj0308.c
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char str[100]={'\0'};
char nums[100]={'\0'};
int gcd(int a){
int flag=1,i;
for(i=2;i<a/2;i++){
if(a%i==0){
flag=0;
break;
}
}
if(flag){
return a;
}else{
return a/i;
}
}
int main(){
gets(str);
int len=strlen(str);
int num=0,c=1,k=0;
for(int i=0;i<len;i++){
if(isdigit(str[i])){
nums[k++]=str[i];
}
}
len=strlen(nums);
for(int i=len-1;i>=0;i--){
num=num+((int)nums[i]-48)*c;
c*=10;
}
printf("%d",gcd(num));
return 0;
}
P-0134 数字分解排序
//xdoj0134.c
#include<stdio.h>
const long long maxn = 1e10;
void swap(int*a ,int* b){
int t=*a;
*a=*b;
*b=t;
}
int main(){
long long n;
int i=0,j,max,len;//2^31-1 > 10 0000 0000
int nums[10]={0};
scanf("%lld",&n);
if(n>0&&n<maxn){
while(n!=0){
nums[i++]=n%10;
n/=10;
}
len=i;
for(i=0;i<len-1;i++){
for(j=i+1,max=i;j<len;j++){
if(nums[max]<nums[j]){
max=j;
}
}
if(max!=i){
swap(&nums[max],&nums[i]);
}
}
for(i=0;i<len;i++){
printf("%d ",nums[i]);
}
}
return 0;
}
P-0135 拼数字排序
//xdoj0135.c
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void swap(int* a,int *b){
int t=*a;
*a=*b;
*b=t;
}
void sort(int* nums,int length){
int i,j,max;
for(i=0;i<length-1;i++){
for(j=i+1,max=i;j<length;j++){
if(nums[max]<nums[j]){
max=j;
}
}
if(max!=i){
swap(&nums[max],&nums[i]);
}
}
}
int main(){
char str[105]={'\0'};
gets(str);
int len=strlen(str);
int nums[100]={0};
int stack[100]={0},k=0,j=0,t=0,count=0;
for(int i=0;i<len;i++){
if(isdigit(str[i])){
for(;str[i]!='\0' && isdigit(str[i]);i++){
stack[k++]=(int)str[i]-48;
}
if(k==1){
nums[j++]=stack[0];
count++;
}else{
t=stack[0];
for(int v=1;v<k;v++){
t*=10;
t+=stack[v];
}
nums[j++]=t;
count++;
}
t=0;
k=0;
}
}
sort(nums,count);
for(int i=0;i<count;i++){
printf("%d ",nums[i]);
}
return 0;
}
P-0167 数字统计排序
//xdoj0167.c
#include<stdio.h>
struct list{
int data;
int count;
};
void swap(struct list*a,struct list* b){
struct list t=*a;
*a=*b;
*b=t;
}
int main(){
int n;
scanf("%d",&n);
struct list nums[1005]={0};//改成1000会超时
for(int i=0;i<1005;i++){
nums[i].data=-1;//初始化
}
int i,j,maxlen=0,t,max;
for(i=0;i<n;i++){
scanf("%d",&t);
if(t>1000||t<0){
return 0;
}
nums[t].data=t;
nums[t].count++;
if(maxlen<t){
maxlen=t;
}
}
for(i=0;i<=maxlen-1;i++){
if(nums[i].data==-1){
continue;
}
for(j=i+1,max=i;j<=maxlen;j++){
if(nums[i].data!=-1){
if(nums[j].count>nums[max].count){
max=j;
}else if(nums[j].count==nums[max].count){
if(nums[j].data<nums[max].data){//值小的排前面
max=j;
}
}
}
}
if(max!=i){
swap(&nums[max],&nums[i]);
}
}
for(i=0;i<=maxlen;i++){
if(nums[i].data!=-1){
printf("%d %d\n",nums[i].data,nums[i].count);
}
}
return 0;
}
P-0169 文件排序
//xdoj0169.c
#include<stdio.h>
struct info{
int y;//year
int m;//month
int d;//day
int s;//size
};
typedef struct info inf;
void swap(inf* a,inf* b){
inf t=*a;
*a=*b;
*b=t;
}
int main(){
struct info infos[100];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d/%d/%d %d",&infos[i].y,&infos[i].m,&infos[i].d,&infos[i].s);
}
//sort
int i,j,max;
for(i=0;i<n-1;i++){
for(j=i+1,max=i;j<n;j++){
if(infos[j].y>infos[max].y){
max=j;
}else if(infos[j].y==infos[max].y){
if(infos[j].m>infos[max].m){
max=j;
}else if(infos[j].m==infos[max].m){
if(infos[j].d>infos[max].d){
max=j;
}else if(infos[j].d==infos[max].d){
if(infos[j].s>infos[max].s){
max=j;
}
}
}
}
}
if(max!=i){
swap(&infos[i],&infos[max]);
}
}
for(i=0;i<n;i++){
printf("%d/%d/%d %d\n",infos[i].y,infos[i].m,infos[i].d,infos[i].s);
}
return 0;
}
P-0170 复试筛选
//xdoj0170.c
#include<stdio.h>
struct info{
char num[21];
int total;
int en;
};
void swap(struct info* a,struct info* b){
struct info t=*a;
*a=*b;
*b=t;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
struct info stus[200];
for(int i=0;i<m;i++){
scanf("%s %d %d",&stus[i].num,&stus[i].total,&stus[i].en);
}
int i,j,max;
for(i=0;i<m-1;i++){
for(j=i+1,max=i;j<m;j++){
if(stus[j].total>stus[max].total){
max=j;
}else if(stus[j].total==stus[max].total){
if(stus[j].en>stus[max].en){
max=j;
}
}
}
if(max!=i){
swap(&stus[max],&stus[i]);
}
}
for(i=0;i<n;i++){
printf("%s %d %d\n",stus[i].num,stus[i].total,stus[i].en);
}
return 0;
}
P-0171 考勤系统
//xdoj0171.c
#include<stdio.h>
struct info{
int k;
int total;
};
int get_time(int h1,int h2,int m1,int m2){
return ((h2-h1)*60+m2-m1);
}
void swap(struct info* a,struct info* b){
struct info t=*a;
*a=*b;
*b=t;
}
int main(){
int n;
scanf("%d",&n);
struct info infos[105]={0};
int len=0,t1,t2,t3,t4,t5;
for(int i=0;i<n;i++){
scanf("%d %d:%d %d:%d",&t1,&t2,&t3,&t4,&t5);
if(len<t1){
len=t1;
}
infos[t1].k=t1;
infos[t1].total += get_time(t2,t4,t3,t5);
}
int i,j,max;
for(i=1;i<=len-1;i++){
if(infos[i].k==0){
continue;
}
for(j=i+1,max=i;j<=len;j++){
if(infos[j].k!=0){
if(infos[j].total>infos[max].total){
max=j;
}else if(infos[j].total==infos[max].total){
if(infos[j].k<infos[max].k){
max=j;
}
}
}
}
if(max!=i){
swap(&infos[max],&infos[i]);
}
}
for(i=1;i<=len;i++){
if(infos[i].k){
printf("%d %d\n",infos[i].k,infos[i].total);
}
}
return 0;
}
P-0172 构造表达式
只能一个个搜索吧,优先加减法,最后在在 ‘ ’ 这个符号的运算
//xdoj0172.c
#include<stdio.h>
int ans=0;
int n;
void dfs(int num,int space,int i,int sum){
if(i==n+1){//结束标志
if(space==0){
if(sum==0){
ans++;
}
}
return;
}else if(i<n+1){//遍历候选的节点
dfs(0,0,i+1,sum+10*space+i);//加法
if(i>1&&num!=i-1){
dfs(0,0,i+1,sum-10*space-i);//减法
}
if(i<n){
dfs(num+1,10*space+i,i+1,sum);
}
}
return;
}
int main(){
scanf("%d",&n);
if(n<3||n>9){
return 0;
}
dfs(0,0,1,0);
printf("%d",ans);
return 0;
}
P-0173 购票系统
(注意有不得不拆座位的情况,比如21组数据,前20个全是4,最后一个是2)
//xdoj0173.c
#include<stdio.h>
//第n行第m个的序号是 (n-1)*5+m;
//那么对于数组的索引 则是 r*5+c+1;
void SearchSeats(int seats[20][5],int p){
int r=0,c=0,count=0,flag=0;//flag表示 不得不拆开座位的情况
if(p==5){//p是5的情况只有一类
for(r=0;r<20;r++){
if(seats[r][0]==0&&seats[r][1]==0&&seats[r][2]==0&&seats[r][3]==0&&seats[r][4]==0){
for(int i=0;i<5;i++){
seats[r][i]=1;//表示已经有座位了
}
printf("%d %d %d %d %d\n",r*5+1,r*5+2,r*5+3,r*5+4,(r+1)*5);
return;
}
}
flag=1;//函数没有return,说明这是特殊情况
}else{
for(r=0;r<20;r++){
count=0;
for(c=0;c<5;c++){
if(seats[r][c]==0){
count++;
}else{
count=0;
}
if(count==p){
for(int i=c-p+1;i<=c;i++){
seats[r][i]=1;
printf("%d ",r*5+i+1);
}
printf("\n");
return;
}
}
}
flag=1;//函数没有return,不得不拆开座位
}
if(flag){//座位没有相邻的了
count=0;
for(r=0;r<20;r++){
for(c=0;c<5;c++){
if(seats[r][c]==0&&count!=p){
seats[r][c]=1;
printf("%d ",r*5+c+1);
count++;
}
if(count==p){
printf("\n");
return;
}
}
}
}
}
int main(){
int count=0,seats[20][5]={0};//0表示座位是空
int n,p[100],t,max=0;
scanf("%d",&n);
if(n>100||n<1){
return 0;
}
for(int i=0;i<n;i++){
scanf("%d",&t);
max+=t;
if(t<1||t>5){
return 0;
}
p[i]=t;
}
if(max>100){
return 0;
}
for(int i=0;i<n;i++){
SearchSeats(seats,p[i]);
}
return 0;
}
P-0174 分配宝藏
只要sumA趋近总价值的一半就行了,所以最多装V/2
//xdoj0174.c
#include<stdio.h>
int w[201]={0},dp[201][2001]={0};
int max(int a,int b){
return a>b?a:b;
}
int main(){
int n,V=0,i,j;//V 表示总价值
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
V+=w[i];
}
for(i=1;i<=n;i++){
for(j=1;j<=V/2;j++){//最多装一半
if(w[i]>j){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]);
}
}
}
int SumA=dp[n][V/2];
printf("%d",V-2*SumA);
return 0;
}
P-0175 窗口模拟
//xdoj0175.c
#include<stdio.h>
struct Windows{
int x1;
int x2;
int y1;
int y2;
int id;//编号
};
struct Clicks{
int x;
int y;
};
struct Windows wins[10];
struct Clicks click[50];
int flag=0;
void ToTop(struct Windows wins[10],struct Windows t,int index){
//将窗口t放置在最顶部
if(index==0){
return;
}else{
struct Windows temp=t;
for(int i=index;i>=1;i--){
wins[i]=wins[i-1];
}
wins[0]=t;
return;
}
}
int Judge(struct Windows win,struct Clicks click){
if(click.x>=win.x1&&click.x<=win.x2&&click.y>=win.y1&&click.y<=win.y2){
return 1;
}else{
return 0;
}
}
int main(){
int N,M;
scanf("%d%d",&N,&M);
int v=1;//表示原来的编号
for(int i=N-1;i>=0;i--){
scanf("%d%d%d%d",&wins[i].x1,&wins[i].y1,&wins[i].x2,&wins[i].y2);
wins[i].id=v++;
}
for(int i=0;i<M;i++){
scanf("%d%d",&click[i].x,&click[i].y);
}
for(int i=0;i<M;i++){
flag=0;
for(int j=0;j<N;j++){
if(Judge(wins[j],click[i])){
printf("%d\n",wins[j].id);
ToTop(wins,wins[j],j);
flag=1;
break;//点击成功,跳出wins的遍历
}else{
continue;
}
}
if(flag==0){
printf("IGNORED\n");
}
}
return 0;
}
P-0248 股票
//xdoj0248.c
#include<stdio.h>
int main(){
int m,n,p,k,d;
scanf("%d%d%d",&m,&p,&n);
int total=0;
for(int i=0;i<n;i++){
scanf("%d%d",&k,&d);
total-=k*d;
m+=k;
}
printf("%d",total+m*d);
return 0;
}
最后
感兴趣的可以关注我的微信公众号,第一时间收到动态