【倒计时10day 22/155】
文章目录
第十三章链表
1032 Sharing 共享
#include<iostream>
using namespace std;
#define MaxN 100010
char e[MaxN];
int next1[MaxN];
bool visited[MaxN];
int main(){
int add1,add2,N;
scanf("%d %d %d",&add1,&add2,&N);
for(int i=0;i<N;i++){
int add,ne;
char data;
scanf("%d %c %d",&add,&data,&ne);
e[add]=data;
next1[add]=ne;
}
for(int i=add1;i!=-1;i=next1[i]){
visited[i]=true;
}
for(int i=add2;i!=-1;i=next1[i]){
if(visited[i]){
printf("%05d\n",i);
return 0;
}
}
printf("-1\n");
return 0;
}
1074 Reversing Linked List
注意点
1.用数组模拟链表
2.reverse(v.begin(),v.end())逆转函数
3.sort(v.begin()+1,v.end()
sort函数中的vector是用begin()表示不能sort(v+1,v+N);
Code
#include<iostream>
#include<vector>
#include<algorithm>
#define MaxN 100010
int data[MaxN],ne[MaxN];
using namespace std;
int main(){
int startadd,N,K;
scanf("%d %d %d",&startadd,&N,&K);
for(int i=0;i<N;i++){
int ad,num,next;
scanf("%d%d%d",&ad,&num,&next);
data[ad]=num;
ne[ad]=next;
}
vector<int> v;
for(int i=startadd;i!=-1;i=ne[i]){
v.push_back(i);
}
for(int i=0;i+K-1<v.size();i+=K){
reverse(v.begin()+i,v.begin()+i+K);
}
for(int i=0;i<v.size();i++){
printf("%05d %d",v[i],data[v[i]]);
if(i+1==v.size()){
printf(" -1\n");
}else{
printf(" %05d\n",v[i+1]);
}
}
return 0;
}
1097 Deduplication on a Linked List 链表重复数据删除
重要思路
利用unordered_set集合来判断是否有出现过
Code
#include<iostream>
#include<unordered_set>
#include<vector>
#define MaxN 100010
using namespace std;
int data[MaxN],ne[MaxN];
int main(){
int startadd,N;
scanf("%d %d",&startadd,&N);
for(int i=0;i<N;i++){
int ad,num,next;
scanf("%d %d %d",&ad,&num,&next);
data[ad]=num;
ne[ad]=next;
}
vector<int> v,r;
unordered_set<int> S;
for(int i=startadd;i!=-1;i=ne[i]){
if(S.count(data[i])==0&&S.count(-data[i])==0){
S.insert(data[i]);
v.push_back(i);
}else{
r.push_back(i);
}
}
for(int i=0;i<v.size();i++){
printf("%05d %d",v[i],data[v[i]]);
if(i==v.size()-1){
printf(" -1\n");
}else{
printf(" %05d\n",v[i+1]);
}
}
for(int i=0;i<r.size();i++){
printf("%05d %d",r[i],data[r[i]]);
if(i==r.size()-1){
printf(" -1\n");
}else{
printf(" %05d\n",r[i+1]);
}
}
return 0;
}
1133 Splitting A Linked List链表元素分类
Code
#include<iostream>
#include<vector>
#define MaxN 100010
using namespace std;
int data[MaxN],ne[MaxN];
int main(){
int startadd,N,K;
scanf("%d%d%d",&startadd,&N,&K);
for(int i=0;i<N;i++){
int add,num,next;
scanf("%d%d%d",&add,&num,&next);
data[add]=num;
ne[add]=next;
}
vector<int> v1,negative,lessK,moreK;
for(int i=startadd;i!=-1;i=ne[i]){
v1.push_back(i);
}
for(int i=0;i<v1.size();i++){
if(data[v1[i]]<0){
negative.push_back(v1[i]);
}else if(data[v1[i]]>=0&&data[v1[i]]<=K){
lessK.push_back(v1[i]);
}else{
moreK.push_back(v1[i]);
}
}
bool first=true;
for(int i=0;i<negative.size();i++){
if(first){
first=false;
}else{
printf(" %05d\n",negative[i]);
}
printf("%05d %d",negative[i],data[negative[i]]);
}
for(int i=0;i<lessK.size();i++){
if(first){
first=false;
}else{
printf(" %05d\n",lessK[i]);
}
printf("%05d %d",lessK[i],data[lessK[i]]);
}
for(int i=0;i<moreK.size();i++){
if(first){
first=false;
}else{
printf(" %05d\n",moreK[i]);
}
printf("%05d %d",moreK[i],data[moreK[i]]);
}
printf(" -1\n");
return 0;
}
第二章高精度
int -2x109——2x109——9位
longlong -2x1018——2x1018——18位
大于18位的情况的加减等属于高精度计算
1009 Product of Polynomials(第一个测试点过不了)
我的代码:第一个测试点过不了,求大佬
#include<iostream>
#include<map>
#define epsilone 1E-15
using namespace std;
map<int,double,greater<int>> mp1,mp2,mp;
int main(){
int K,exp;
double col;
for(int i=0;i<2;i++){
scanf("%d",&K);
for(int j=0;j<K;j++){
scanf("%d %lf",&exp,&col);
if(i==0){
mp1[exp]=col;
}else{
mp2[exp]=col;
}
}
}
map<int,double,greater<int>>::iterator it1,it2,it;
double col1,col2;
int exp1,exp2;
for(it1=mp1.begin();it1!=mp1.end();it1++){
for(it2=mp2.begin();it2!=mp2.end();it2++){
exp1=it1->first;
exp2=it2->first;
col1=it1->second;
col2=it2->second;
mp[exp1+exp2]+=col1*col2;
}
}
cout<<mp.size();
for(it=mp.begin();it!=mp.end();it++){
printf(" %d %.1lf",it->first,it->second);
}
printf("\n");
return 0;
}
根据y总代码重写的,主要注意printf double类型不是%d是%lf,其他都挺easy
#include<iostream>
#define MaxN 1010
using namespace std;
double A[MaxN],B[MaxN],C[2*MaxN];
int main(){
int K1,K2,exp;
double col;
scanf("%d",&K1);
for(int i=0;i<K1;i++){
scanf("%d%lf",&exp,&col);
A[exp]=col;
}
scanf("%d",&K2);
for(int i=0;i<K2;i++){
scanf("%d%lf",&exp,&col);
B[exp]=col;
}
for(int i=0;i<MaxN;i++){
for(int j=0;j<MaxN;j++){
if(A[i]&&B[j]){
C[i+j]+=A[i]*B[j];
}
}
}
int cnt=0;
for(int i=0;i<2*MaxN;i++){
if(C[i]){
cnt++;
}
}
printf("%d",cnt);
for(int i=2*MaxN-1;i>=0;i--){
if(C[i]){
printf(" %d %.1lf",i,C[i]);
}
}
printf("\n");
return 0;
}
1023 Have Fun with Numbers 趣味数字
转换成数组,类似多项式
A0*A0+A1*A1…
利用tag进行进位运算
易错点:
1.看清题目,无论yes或no都输出double后的number
2.最后一次判断完要额外看看有没有可能进多一位最高位
if(tag){
b+=to_string(tag);
}
3.string的sort用法和vector的一样
4.vector间也可以使用==
vector<int>a;
vector<int>b;
if(a==b){}…
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
string a;
cin>>a;
vector<int> v;
for(int i=a.size()-1;i>=0;i--){
v.push_back(a[i]-'0');//vec逆序存储
}
string b,c;
int tag=0;
for(int i=0;i<v.size();i++){
int temp=v[i]+v[i]+tag;
b+=to_string(temp%10);
tag=temp/10;
}
if(tag){
b+=to_string(tag);
}
c=b;
sort(a.begin(),a.end());
sort(b.begin(),b.end());
reverse(c.begin(),c.end());
if(a==b){
printf("Yes\n");
}else{
printf("No\n");
}
printf("%s\n",c.c_str());
return 0;
}
第三章进位制
1019 General Palindromic Number普通回文数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int N,b;
scanf("%d%d",&N,&b);
vector<int> a,t;
if(!N) a.push_back(0);
while(N){
a.push_back(N%b);
N/=b;
}
t=a;
reverse(t.begin(),t.end());
if(a==t){
puts("Yes");
}else{
puts("No");
}
printf("%d",a[a.size()-1]);
for(int i=a.size()-2;i>=0;i--){
printf(" %d",a[i]);
}
printf("\n");
return 0;
}