1001
C++新特性里的to_string()函数可以将数字变为字符串,非常方便
#include
#include
using namespace std;
int main() {
int a, b;
cin >> a >> b;
string c = to_string(a + b);
int flag = 0;
for (int i = 0; i
1002
映射法
#include
#include
#include
#include
using namespace std;
int main() {
float hashT[1001];
memset(hashT,0,sizeof(hashT));
int k,cnt=0;
for(int i=0;i<2;++i){
scanf("%d",&k);
int N;
float ai;
for(int j=0;j=0;--i){
if(hashT[i]!=0.0){
printf(" %d %.1f",i,hashT[i]);
}
}
return 0;
}
1003
经典的Dijkstra算法,dist[i]数组存储起始点到i点的路径长度,w[i]存储当前路径下最多的救援队数目,num[i]存储起点到达i点的最短路径数目。
#include
#include
#include
#define INF 1000000
using namespace std;
/*
scatter 分散
call up hands 召集人手
*/
int main() {
int N,M,C1,C2;
int dist[510];//起点到终点的距离
int e[510][510];//边的权重
int num[510];//代表起点到终点最短路径的条数
int weight[510];//代表各个城市救援队的数目
int w[510];//代表起点到终点救援队的数目
bool visited[510];//代表该结点是否访问过
fill(e[0],e[0]+510*510,INF);
fill(dist,dist+510,INF);
scanf("%d %d %d %d",&N,&M,&C1,&C2);
for(int i=0;idist[u]+e[u][v]){
dist[v]=dist[u]+e[u][v];//如果距离小,更新v到起点的距离
num[v]=num[u];
w[v]=w[u]+weight[v];
}else if(dist[v]==dist[u]+e[u][v]){
num[v]=num[u]+num[v];
if(w[u]+weight[v]>w[v]){//更新救援队数目
w[v]=w[u]+weight[v];
}
}
}
}
}
printf("%d %d",num[C2],w[C2]);
return 0;
}
1004
题目的意思是输出一棵树每一层的叶子节点数目,使用邻接表存储输入的树。用dfs遍历每一个节点,并用一个高度数组存储每一层叶子节点的数目。
#include
#include
#include
#include
#include
using namespace std;
vector tree[100];
int book[100],max_depth=-1;
/*
pedigree 血统 家族
*/
void dfs(int index,int depth){
if(tree[index].size()==0){
book[depth]++;
max_depth=max(depth,max_depth);
return;
}
for(int i=0;i
1005
#include
#include
#include
#define charToNum(x) (x-'0')
using namespace std;
int main() {
int sum = 0;
string hashT[] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
string input;
cin >> input;
for (int i = 0; i
1006
字符串处理
#include
#include
using namespace std;
int main() {
string unlock,lock,input;
int N,t_ul_h,t_ul_m,t_ul_s,t_l_h,t_l_m,t_l_s;
int ul=999999,l=0;
cin>>N;
for(int i=0;i>input;
scanf("%d:%d:%d",&t_ul_h,&t_ul_m,&t_ul_s);
scanf("%d:%d:%d",&t_l_h,&t_l_m,&t_l_s);
int t_ul=t_ul_h*3600+t_ul_m*60+t_ul_s;
int t_l=t_l_h*3600+t_l_m*60+t_l_s;
if(ul>t_ul){
unlock=input;
ul=t_ul;
}
if(l
1007
最大连续子列和问题
递推式:
dp[i]表示以i结尾的子列的最大和
#include
#include
using namespace std;
/*
indices index的复数
*/
int main() {
int N;
int dp[10010],save[10010];
dp[0]=0;
cin>>N;
int left=1,right=N,max_num=-1,temp=1;
for(int i=1;i<=N;++i){
cin>>save[i];
}
for(int i=1;i<=N;++i){
if(dp[i-1]>0){
dp[i]=dp[i-1]+save[i];
}else{
dp[i]=save[i];
temp=i;
}
if(dp[i]>max_num){
left=temp;
right=i;
max_num=dp[i];
}
}
if(max_num<0){
max_num=0;
left=1;
right=N;
}
cout<
1008
??甲级
#include
#include
using namespace std;
/*
denote 代表 指代 预示
*/
int main() {
int N,sum=0,refloor=0,floor;
cin>>N;
for(int i=0;i>floor;
floor>refloor?sum+=(6*(floor-refloor)):sum+=(4*(refloor-floor));
sum+=5;
refloor=floor;
}
cout<
1009
num数组开1000只有5分...开1001就25分了
#include
#include
#include
using namespace std;
int main() {
double num1[1001]={0.0};
double answer[2010]={0.0};
int K1,K2,expo,cnt=0;
double coef;
scanf("%d",&K1);
for(int i=0;i=0;--i){
if(answer[i]!=0)printf(" %d %.1f",i,answer[i]);
}
return 0;
}
1011
?????甲级
#include
#include
#include
using namespace std;
/*
trophy 纪念品,战利品
lottery 彩票
triple 三倍的
tie 平局
odd 奇数的
product 乘积
time 乘以
*/
int main() {
double w,t,l,sum=0.65;
char output[]={'W','T','L'};
int num[3];
for(int i=0;i<3;++i){
scanf("%lf%lf%lf",&w,&t,&l);
if(w>t&&w>l){
num[i]=0;
sum*=w;
}else if(t>w&&t>l){
num[i]=1;
sum*=t;
}else{
num[i]=2;
sum*=l;
}
}
for(int i=0;i<3;++i){
printf("%c ",output[num[i]]);
}
printf("%.2f",(sum-1)*2);
return 0;
}
1012
先将学生的四个成绩存储到vector中排序,然后用map存储学生的best rank,按c,m,e,a的顺序更新一个学生的rank
#include
#include
#include
1013
图的连通分量
#include
#include
#include
1015
素数判定+进制转换
#include
#include
#include
#include
#include
#define charToNum(x) (x-'0')
#define numToChar(x) (x+'0')
using namespace std;
/*
decimal 十进制的,小数的
radix 根 基数
negative 负数的 负的
*/
bool isPrime(int x){
if(x==1||x==0)return false;
for(int i=2;i*i<=x;++i){
if(x%i==0)return false;
}
return true;
}
int toDecimal(int x,int r){
string ans="";
int the_num=0;
while(x!=0){
ans+=numToChar(x%r);
x/=r;
}
reverse(ans.begin(),ans.end());
for(int i=0;i
1017
将输入的时间全部转化为秒,再排序。
windows数组记录每个窗口结束工作的时间,如果一个人的到达时间小于窗口的结束工作时间,总等待时常sum增加(结束工作的时间-到达时间)
#include
#include
#include
#include
using namespace std;
struct person{
int tt;
int process;
}t[10000];
bool compare(person a,person b){
return a.tt windows(K,8*60*60);
for(int i=0;i17*60*60){
people--;
continue;
}
int cnt=0;
for(int j=0;jwindows[j]){
cnt=j;
}
}
if(t[i].tt<=windows[cnt]){
sum+=(windows[cnt]-t[i].tt);
windows[cnt]+=t[i].process*60;
}else{
windows[cnt]=t[i].tt+t[i].process*60;
}
}
printf("%.1f",sum/(60*people));
return 0;
}
1018
Dijkstra+dfs
本题主要的坑在于后面节点的单车不能移送给前面的节点,导致第五,第七个测试点无法通过,解决方法是用Dfs回溯所有的节点。
#include
#include
#include
1019
#include
#include
#include
#include
#include
using namespace std;
/*
notation 记号
*/
int main() {
int N, base;
vector save;
cin >> N >> base;
while (N != 0) {
save.push_back(to_string(N%base));
N /= base;
}
bool isOK = true;
for (int i = 0; i < save.size() / 2; ++i) {
if (save[i] != save[save.size() - i - 1])isOK = false;
}
isOK ? cout << "Yes" << endl : cout << "No" << endl;
bool flag = true;
reverse(save.begin(), save.end());
for (int i = 0; i < save.size(); ++i) {
if (flag) {
cout << save[i];
flag = false;
}
else {
cout <<" "<< save[i];
}
}
return 0;
}
1021
这是只有23分的代码,第三个测试点超时了,估计是进行了多次深搜的缘故,英国可以用一次深搜解决不过我太懒了
#include
#include
#include
1023
大整数加减进位要注意呀
#include
#include
#include
#include
#define charToNum(x) (x-'0')
#define numToChar(x) (x+'0')
using namespace std;
/*
duplication 重复
permutation 排序
*/
int main() {
int mapper[9];
fill(mapper,mapper+9,0);
string a;
cin>>a;
for(int i=0;i9)flag=true;
t%=10;
a[i]=numToChar(t);
if(--mapper[t]<0)isOk=false;
}
if(flag)a+='1';
isOk&&!flag?cout<<"Yes"<
1024
大整数加减
#include
#include
#include
#define charToNum(x) (x-'0')
#define numToChar(x) (x+'0')
using namespace std;
/*
palindromic 复发的 再发的
via 通过 经过
*/
string add(string x,string y){
string ans="";
int sum=0;
bool flag=false;
for(int i=0;i9){
sum%=10;
flag=true;
}
ans+=numToChar(sum);
sum=0;
}
if(flag)ans+='1';
reverse(ans.begin(),ans.end());
return ans;
}
bool isPalindromic(string x){
string y=x;
reverse(x.begin(),x.end());
return x==y;
}
int main() {
string input;
int step,cnt=0;
cin>>input>>step;
while(cnt++
1025
含有并列的排名如何排序
#include
#include
#include
#include
#include
using namespace std;
/*
simultaneously 同时地 一齐的
testee 考试者
*/
struct testee{
string id;
int grade;
int local_rank;
int rank;
int location;
};
vector save;
bool cmp(testee a,testee b){
return a.grade!=b.grade?a.grade>b.grade:a.id atemp;
for(int j=0;j>temp.id>>temp.grade;
temp.location=i+1;
atemp.push_back(temp);
}
sort(atemp.begin(),atemp.end(),cmp);
int cnt=1,saver=1;
atemp[0].local_rank=1;
for(int i=1;i
1027
十进制转13进制
#include
#include
using namespace std;
string trans(int x){
string ans="";
char hashT[]={'A','B','C'};
int a=x/13;
int b=x%13;
if(a>=0&&a<10)ans+=(a+'0');
else if(a>=10)ans+=hashT[a-10];
if(b>=0&&b<10)ans+=(b+'0');
else if(b>=10)ans+=hashT[b-10];
return ans;
}
int main() {
int r,g,b;
cin>>r>>g>>b;
cout<<"#"<
1029
双指针法,第二行不用存储,在线处理即可
#include
#include
#include
using namespace std;
int main() {
int N,M,temp,flag=0;
int count=0;
vector save;
scanf("%d",&N);
save.resize(N);
for(int i=0;isave[flag]&&flag
1030
Dijkstra+dfs
1018的简化版,把点权改成了边权
#include
#include
#include
#include
#define INF 1000000
using namespace std;
int N,M,S,D,min_cost=INF;
int dist[510],weight[510][510],e[510][510];
bool visit[510];
vector save[510];
vector path,temppath;
void Dfs(int v){
temppath.push_back(v);
if(v==S){
int cost=0;
for(int i=0;i=0;--i){
printf("%d ",path[i]);
}
printf("%d",dist[D]);
printf(" %d",min_cost);
return 0;
}
1031
#include
#include
#include
#include
using namespace std;
/*
vertical 竖直的 垂直的
*/
int main() {
string input;
cin>>input;
int k,t=3;
int maxlen=0;
for(;t<=input.size();++t){
for(k=0;k<=t;k++){
if(input.length()+2==2*k+t){
maxlen=max(maxlen,k);
}
}
}
t=input.size()+2-2*maxlen;
for(int i=0;i
1032
简单的链表题
#include
#include
#include
#define INF 100000
using namespace std;
/*
suffix 后缀 词尾
*/
int main() {
int add[INF];
int head1,head2,N,temp,next;
bool visit[INF];
memset(visit,0,sizeof(visit));
char alpha;
cin>>head1>>head2>>N;
for(int i=0;i>temp>>alpha>>next;
add[temp]=next;
}
while(head1!=-1){
visit[head1]=true;
head1=add[head1];
}
while(head2!=-1){
if(!visit[head2]){
visit[head2]=true;
head2=add[head2];
}else break;
}
if(head2!=-1)
printf("%05d",head2);
else
printf("-1");
return 0;
}
1035
姥姥日常挖坑。。。注意account单复数
#include
#include
#include
#include
using namespace std;
/*
generate 形成 造成
*/
struct line{
string id;
string pwd;
}lines[1000];
bool flag[1000];
int main() {
int N,cnt=0;
fill(flag,flag+1000,0);
cin>>N;
for(int i=0;i>lines[i].id>>lines[i].pwd;
for(int j=0;j
1036
怕不是假的甲级
#include
#include
#include
using namespace std;
/*
distinct 不同的,明显的
*/
int main() {
int N;
string name,id,name_man,id_man,name_girl,id_girl;
char gender;
int grade,min_man=101,max_girl=-1;
cin>>N;
for(int i=0;i>name>>gender>>id>>grade;
if(gender=='F'&&grade>max_girl){
max_girl=grade;
name_girl=name;
id_girl=id;
}else if(gender=='M'&&grade
1037
将正数与负数分开存储,然后贪心
#include
#include
#include
using namespace std;
/*
bonus 奖金
exceed 超过 超越
*/
bool cmp(int a,int b){
return a>b;
}
int main() {
int N,K,temp,sum=0,flag1=0,flag2=0;
vector coupon_1,coupon_2,product_1,product_2;
cin>>N;
for(int i=0;i>temp;
if(temp>0)
coupon_1.push_back(temp);
else
coupon_2.push_back(temp);
}
cin>>K;
for(int i=0;i>temp;
if(temp>0)
product_1.push_back(temp);
else
product_2.push_back(temp);
}
sort(coupon_1.begin(),coupon_1.end(),cmp);
sort(product_1.begin(),product_1.end(),cmp);
sort(coupon_2.begin(),coupon_2.end());
sort(product_2.begin(),product_2.end());
for(;flag1
1038
这道题直接sort是不行的,要比较两个字符串谁在前面,只需将两者分别加起来比较就行。可以用erase方法删除首元素的0
#include
#include
#include
#include
using namespace std;
/*
segment 部分
*/
bool cmp(string a,string b){
return a+b>N;
vector input;
for(int i=0;i>temp;
input.push_back(temp);
}
sort(input.begin(),input.end(),cmp);
for(int i=0;i
1040
回文数的动态规划问题
dp[i][j]=1代表i~j为回文字符串
dp[i][j]=0代表i~j不是回文字符串
如果str[i]==str[j],dp[i][j]=dp[i+1][j-1]
#include
#include
#include
using namespace std;
/*
symmetric 相称的 均衡的
*/
int main() {
int max_num=1;
string str;
getline(cin,str);
int dp[1010][1010];
for(int i=0;i
1041
hash散列
#include
#include
#include
#include
using namespace std;
int main() {
int ascii[100000],N;
vector save;
memset(ascii,0,sizeof(ascii));
cin>>N;
for(int i=0;i>temp;
ascii[temp]++;
save.push_back(temp);
}
for(int i=0;i
1046
数组的每一项保存第一个node到这一项的node的距离,当要求两点距离时,只需将右边的距离减去左边的距离即可
#include
#include
#include
using namespace std;
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int main() {
int N,e[100000],sum=0,temp;
e[0]=0;
cin>>N;
for(int i=1;i<=N;++i){
cin>>temp;
sum+=temp;
e[i]=e[i-1]+temp;
}
int K,node1,node2;
cin>>K;
for(int i=0;i>node1>>node2;
if(node1>node2)swap(node1,node2);
int len=e[node2-1]-e[node1-1];
cout<<(len>sum-len?sum-len:len)<
1047
#include
#include
#include
#include
#include
using namespace std;
/*
sake 缘故 理由
*/
int main() {
int N,K,C,id;
cin>>N>>K;
vector save[2510];
string name;
for(int i=0;i>name>>C;
for(int i=0;i>id;
save[id].push_back(name);
}
}
for(int i=1;i<=K;++i){
sort(save[i].begin(),save[i].end());
printf("%d %d\n",i,save[i].size());
for(int j=0;j
1048
#include
#include
using namespace std;
int main() {
int N,M,a[1001],input;;
cin>>N>>M;
memset(a,0,sizeof(a));
for(int i=0;i>input;
a[input]++;
}
for(int i=0;i<1001;++i){
if(a[i]){
a[i]--;
if(M>i&&a[M-i]!=0){
cout<
1052
链表排序题
#include
#include
#include
#include
using namespace std;
/*
adjacent 相邻的
*/
struct node{
int data;
int next;
int add;
};
bool cmp(node a,node b){
return a.data output;
int N,head,add,next,data;
scanf("%d %d",&N,&head);
for(int i=0;i
1054
stl map的使用
#include
#include
#include
1076
图的bfs,关键是stl中queue的使用,首先先把待查询的node入队,然后将node出队,把与node相连的节点依次入队,直到队列为空为止。
#include
#include
#include
#include
using namespace std;
/*
query 询问
trigger 扳机
*/
struct node{
int id;
int level;
};
int N,L,K;
vector graph[1010];
int bfs(node query){
bool vis[1010];
memset(vis,0,sizeof(vis));
queue q;
q.push(query);
vis[query.id]=true;
int cnt=0;
while(!q.empty()){
node top=q.front();
q.pop();
for(int i=0;i>N>>L;
for(int i=1;i<=N;++i){
int num;
cin>>num;
for(int j=0;j>temp;
graph[temp].push_back(i);
}
}
cin>>K;
for(int i=0;i>query;
node temp={query,0};
printf("%d\n",bfs(temp));
}
return 0;
}
1078
哈希表的平方探测,关键是index=(x+step*step)%M
将step的平方加上原来的下标再取余size,当step的值已经达到size时终止循环
#include
#include
using namespace std;
/*
collision 冲突
quadratic 二次的
*/
int M,N,input;
bool hashT[10010];
bool is_prime(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;++i){
if(x%i==0)return false;
}
return true;
}
void insert(int x){
for(int step=0;step>M>>N;
while(!is_prime(M))M++;
for(int i=0;i>input;
if(i!=0)cout<<" ";
insert(input);
}
return 0;
}
1079
给定一棵树,从根节点开始dfs
另外pow()比自己用for快
#include
#include
1094
求generation最大的一代,先用二维数组存储这棵树,然后从根节点开始dfs
#include
#include
#include
#include
#include
using namespace std;
int N,M,levels[110];
vector tree[110];
void dfs(int node,int level){
levels[level]++;
if(tree[node].size()==0) return;
for(int i=0;imax_size){
max_size=levels[i];
max_level=i;
}
}
cout<
1145
哈希表的二次方探测法
注意检索的时候,如果,要提前return
#include
#include
#include
using namespace std;
int MSize,N,M;
int hashT[10010];
double cnt=0;
bool vis[10010];
bool is_prime(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;++i){
if(x%i==0)return false;
}
return true;
}
void insert(int x){
for(int step=0;step>MSize>>N>>M;
while(!is_prime(MSize))MSize++;
for(int i=0;i>input;
insert(input);
}
for(int i=0;i>input;
find(input);
}
printf("%.1f",cnt/M);
return 0;
}