基本
#include<iostream>
#include<algorithm>
using namespace std;
bool complare(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,
//这是规则
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
斯诺登密码
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int main()
{
char sz[27][10]={"zero","a","both","another","first","second","third","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty"};
int num[27]={0,1,2,2,1,2,3,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char str[60];
gets(str);
int len=strlen(str),j=1,l=0,p=0,i,flag[6],number[100];
flag[0]=0;
for(i=0;i<100;i++)number[i]=0;
for(i=0;i<len;i++)if(str[i]==' '){str[i]='\0';flag[j++]=i+1;}//分解字符串,将空格换成'\0',并保存单词位置
for(i=0;i<j;i++)
for(int k=0;k<27;k++)
if(strcmp(str+flag[i],sz[k])==0)
number[(num[k]*num[k])%100]++;//将单词换成对应得值
for(i=1;i<100;i++)
for(j=0;j<number[i];j++)
if(number[i]&&!p++)cout<<i;
else if(number[i]&&i<10)cout<<0<<i;
else if(number[i])cout<<i;
if(!p)cout<<0;
return 0;
}
例题
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool compare(string a,string b)
{
return a+b>b+a;
}
int main()
{
int n,i;
string a[20];
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,compare);
for(i=0;i<n;i++)
cout<<a[i];
return 0;
}
魔法照片+结构体排序
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct person{
int W;//权值
int num;//序号
int post;//编号
}p[20005];
int W_comp(struct person &a,struct person &b)
{
if(a.W!=b.W) return a.W>b.W;
else return a.post<b.post;
}
int E[11],n,k;
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=10;i++)
scanf("%d",&E[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&p[i].W);
p[i].post=i;
}
sort(p+1,p+n+1,W_comp);
for(i=1;i<=n;i++)
p[i].W+=E[(i-1)%10+1];
sort(p+1,p+1+n,W_comp);
for(i=1;i<=k;i++)
printf("%d ",p[i].post);
return 0;
}


在可选的工作中,每次都选取结束时间最早的工作
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000;
int N,S[MAX_N],T[MAX_N];
pair<int , int >itv[MAX_N];
void solve(){
//对pair进行的是字典序比较
//为了让结束时间早的工作排在前面,把T存入first,把S存入second
for(int i=0;i<N;i++){
itv[i].first=T[i];
itv[i].second=S[i];
}
sort(itv,itv+N);
//t是最后所选工作的结束时间
int ans=0,t=0;
for(int i=0;i<N;i++){
if(t<itv[i].second){
ans++;
t=itv[i].first;
}
}
cout<<ans;
}
int main()
{
freopen("data","r",stdin);
cin>>N;
for(int i=0;i<N;i++)
cin>>S[i];
for(int i=0;i<N;i++)
cin>>T[i];
solve();
return 0;
}
网友评论