一.结构体排序
对char 和int 类型的排序
#include<iostream>
namespace using std;
typedef struct {
char a[10];
b
}c;
int compart(void *e, void *d){
return strcmp(((c*)e)->a,((c*)d)->b);
}
int main(){
c array[55];
qsort (array,55, sizeof(c),compare);
return 0;
}
顺带 sort与qsort区别 sort 是sort(bigin,end) , qsort是qsort(首地址,元素数量,个元素占用空间大小,用于比较的指针)
带上一题学长代码(暂时看不懂)也是类似于先排名字再排数字 ---HDU5131
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <algorithm>
#include <string>
#include <map>
#include <iostream>
#include <vector>
using namespace std;
int n ;
struct node{
string name ;
int v ;
node(string name_,int v_){
name = name_ ;
v = v_;
}
friend bool operator < (const node &a , const node &b){
if (a.v != b.v) return a.v > b.v ;
return a.name < b.name ;
}
};
vector<node> a ;
map<string,int> sum ;
char str[50] , name[50] ;
int x ;
int main(){
//freopen("input.txt","r",stdin);
while (~scanf("%d",&n) && n){
a.clear() ; sum.clear() ;
for (int i = 0 ; i < n ; i++){
scanf("%s%d",str,&x) ;
a.push_back(node((string)str , x)) ;
sum[str] = x;
}
sort(a.begin() , a.end()) ;
for (int i = 0 ; i < a.size() ; i++)
cout << a[i].name << " " << a[i].v << endl ;
int m ; scanf("%d",&m) ;
while (m--){
scanf("%s",name) ;
int find = sum[name] ;
int major = 1 , minor = 1 ;
for (int i = 0 ; i < a.size() ; i++){
if (a[i].v > find) major++ ;
else if (a[i].v == find && a[i].name < name) minor++ ;
}
if (minor == 1) printf("%d\n",major);
else printf("%d %d\n",major,minor) ;
}
}
return 0;
二.
高精度加法
#include<stdio.h>
#include<string.h>
int sum[150];
void add(char *a){
int len = strlen(a);
int k = 1;
for(int i = len -1; i>= 0; i--){
sum[k] += a[i] - '0';
sum[k+1] += sum[k] /10;
sum[k] %= 10;
k++;
}
}
int main(){
char a[150][150];
int i;
for(int i = 0; ;i ++){
gets(a[i]);
int n = strlen(a[i]);
if(n==1&&a[i][0] == '0') break;
add[i];
}
int flag = 0;
for(int i = 149; i >=1; i--){
if(flag == 0&& sum[i] == 0) continue;
else {
flag = 1;
printf("%d", sum[i]);
}
}
return 0;
} ---------------高精度乘法以后补上
三.
sort 的具体用途
用来排序结合贪心
例 UVA 11292 fire-breathing dragon(看图怎么像大黄鸭- -||)
#include<cstdio> ---------C++函数还不是很清楚..头文件写的比较多怕少了
#include<cstdib>
#include<cmath>
#include<algorithm>
using namespace std;
int w[20005],v[20005],dp[20005];
int main(){
int n, m;
while(~scanf("%d%d", &n , &m)){
int cost = 0;
for(int i = 0; i < n; i++){
scanf("%d", &w[i]);
}
for(int i = 0; i < m; i++){
scanf("%d", &v[i]);
}
sort(w,w+n);
sort(v,v+m);
if( n > m) {printf("Loowater is doomed!\n"); continiu;}
int index = 0, flag = 0;
for(int i = 0; i < n; i++){
while(w[i] > v[index]){
index ++;
}
cost += v[index];
index++;
flag++;
if(index > m ) break;
}
if(index == n )
printf("%d\n",cost);
else printf("Loowater is doomed!\n");
}
return 0;
}
就是排序,从小到大让knight 从小到大跟head去打,用while语句来使knight能打得过,如果超过了m人数,说明打不过了.
留下一个问题,以后解决
POJ 2739
Sum of Consecutive Prime Numbers
最后留下一道被坑的- -题目没看清楚
humidex ---POJ 3299
#include<cstdio>
#include<cmath>
using namespace std;
#define exp 2.718281828
int main(){
double a,b,c,d,e,f,temperature, humidex, h,dewpoint;
char n,m,p,q;
while(~scanf("%c",&n)){
if(n == 'E') break;
scanf("%lf %c %lf", &a, &m, &b);
getchar();
if( n == 'T' && m == 'D'){
e = 6.11 * pow (exp,(5417.7530 * ((1/273.16) - (1/(b+273.16)))));
h = (0.5555) * (e - 10.0);
humidex = a + h;
printf("T %.1lf D %.1lf H %.1lf\n", a, b, humidex);
}
else if( n == 'D'&& m == 'T'){
e = 6.11 * pow(exp, (5417.7530*((1/273.16) - (1/(a + 273.16)))));
h = (0.5555) * ( e - 10.0);
humidex = b + h;
printf("T %.1lf D %.1lf H %.1lf\n", b, a, humidex);
}
else if(n == 'T' &&m == 'H'){
h = b - a;
e = 1.0*h/0.5555 + 10.0;
dewpoint = 1/(-(log(e/6.11)/5417.7530 - 1/273.16))-273.16;
printf("T %.1lf D %.1lf H %.1lf\n", a,dewpoint, b);
}
else if(n == 'H' && m =='T'){
h = a - b;
e = h/0.5555 + 10.0;
dewpoint = 1/(-(log(e/6.11)/5417.7530 - 1/273.16))-273.16;
printf("T %.1lf D %.1lf H %.1lf\n", b, dewpoint, a);
}
else if(n == 'D' && m == 'H'){
e = 6.11* pow(exp, (5417.7530*((1/273.16) - (1/(a + 273.16)))));
h = (0.5555)*(e - 10.0);
temperature = b - h;
printf("T %.1lf D %.1lf H %.1lf\n", temperature, a , b);
}
else if(n == 'H' && m == 'D'){
e = 6.11*pow(exp,(5417.7530*((1/273.16) - (1/(b+273.16)))));
h = (0.5555)*(e- 10.0);
temperature = a - h;
printf("T %.1lf D %.1lf H %.1lf\n",temperature,b,a);
}
}
return 0;
}