2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1235467890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
#include
#include
using namespace std;
struct Student{
char id[15]; //准考证号
int score; //分数
int location_number; //考场号
int location_rank; //考场内排名
int total_rank;
}stu[100];
bool cmp(Student a,Student b){
// 按分数排名
return a.score>b.score;
}
int main(){
int location_size; // 考场数
scanf("%d",&location_size);
int location1_size; // 考场1学生数
scanf("%d",&location1_size);
for(int i=0;i
#include
const int max = 100010;
bool hash[max] = {false};
int main(){
int n,m,temp;
scanf("%d",&n);
for(int i=0;i
问M个欲查询的数中每个数在N中出现的次数
#include
const int max = 100010;
int hash[max] = {false};
int main(){
int n,m,temp;
scanf("%d",&n);
for(int i=0;i
#include
int hashFunc(char c[],int len){
int id = 0;
for(int i=0;i
#include
const int maxn = 100;
char S[maxn][5],temp[5];
int hash[62 * 62 * 62 + 10];
int hashFunc(char c[],int len){ // hash函数
int id = 0;
for(int i=0;i='A'&&c[i]<='Z')
id = id * 62 + (c[i] - 'A');
else if(c[i]>='a'&&c[i]<='z')
id = id * 62 + (c[i] - 'a') + 26;
else
id = id * 62 + (c[i] - '0') + 52;
}
return id;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i
5.全排列问题:输出1~n这n个整数的全排列
#include
const int maxn = 11;
// 数组P是当前全排列,hash表示数字是否在数组中出现过
int P[maxn],n,hash[maxn] = {false};
void generateP(int index){
if(index == n+1){ // 递归边界,已经处理完排列的1~n位
for(int i=1;i<=n;i++){
printf("%d",P[i]);
}
printf("\n");
return;
}
for(int x=1;x<=n;x++){ //处理第1~n位
if(hash[x]==false){ //如果x不在当前排列中
P[index] = x; //把x加入当前排列
hash[x] = true; //更新hash函数
generateP(index+1); //处理index+1号位
hash[x] = false; //已处理完P[index]为x的子问题,还原状态
}
}
}
int main(){
n= 3;
generateP(1); // 从P(1)开始
return 0;
}
#include
#include
const int maxn = 11;
// 数组P是当前全排列,hash表示数字是否在数组中出现过
int P[maxn],n,hash[maxn] = {false};
int count = 0; // 记录可行方案的个数
void generateP(int index){
if(index == n+1){ // 递归边界
bool flag = true; //假设可行
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(abs(i-j)==abs(P[i]-P[j]))
flag = false; // 对角线存在不同元素,不可行
}
}
if(flag) count++;
return;
}
for(int x=1;x<=n;x++){ //处理第1~n位
if(hash[x]==false){ //如果x不在当前排列中
P[index] = x; //把x加入当前排列
hash[x] = true; //更新hash函数
generateP(index+1); //处理index+1号位
hash[x] = false; //已处理完P[index]为x的子问题,还原状态
}
}
}
int main(){
n= 4;
generateP(1); // 从P(1)开始
printf("%d",count);
return 0;
}
回溯法:
#include
#include
const int maxn = 11;
// 数组P是当前全排列,hash表示数字是否在数组中出现过
int P[maxn],n,hash[maxn] = {false};
int count = 0; // 记录可行方案的个数
void generateP(int index){
if(index == n+1){ // 递归边界
count++;
return;
}
for(int x=1;x<=n;x++){ //处理第1~n位
if(hash[x]==false){ //考虑第x行
bool flag = true;
for(int pre=1;pre
#include
#include
using namespace std;
struct moon_cake{ // 存放月饼数据的结构体
int save;
int sale;
} moon[10];
bool cmp(moon_cake a,moon_cake b){ //比较函数,得到单价最大
return ((float)a.sale/a.save) > ((float)b.sale/b.save);
}
int main(){
int N,D;
scanf("%d %d",&N,&D);
for(int i=0;i0){
if(D > moon[k].save){ //需求量大于存储量
total_sale += moon[k].sale;
D = D - moon[k].save;
}
else{ //需求量小于存储量
total_sale = total_sale + (float)moon[k].sale* D / moon[k].save;
D = 0;
}
k ++;
}
printf("%.2f\n",total_sale);
return 0 ;
}
#include
using namespace std;
int main(){
int number[10];
for(int i=0;i<10;i++){ //得到0~9的个数
scanf("%d",&number[i]);
}
for(int i=1;i<10;i++){ //得到第一个不为0的最小的数
if(number[i]!=0){
printf("%d",i);
number[i]--;
break;
}
}
for(int i=0;i<10;i++){ // 按顺序得到后续的数
while(number[i]!=0){
printf("%d",i);
number[i]--;
}
}
return 0;
}