1.报数
看注释即可:
#include<iostream>
#include<cstring>
using namespace std;
int is_7(int x){
if(x%7==0) return 1;
while(x){
if(x%10==7) return 1;
x/=10;
}
return 0;
}
int n; //记录当前报了多少个数字
int t;//记录当前报到了哪个数字, t不一定等于n
int pass[4];
int main(){
cin>>n;
t=1;
while(n){
if(is_7(t)) pass[(t-1)%4]++;
else n--;
t++;
}
for(int i=0;i<4;i++)
cout<<pass[i]<<endl;
}
2.回收站选址
本题技巧在于用两个dir数组,一个用于寻找可摆放位置,一个用于查找分数
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<unordered_map>
#define N 1010
using namespace std;
unordered_map<int,unordered_map<int,int> > mp;
int n;
int score[5];
int a[N][2];
int dir1[4][2]={0,1,1,0,-1,0,0,-1};
int dir2[4][2]={1,1,-1,-1,1,-1,-1,1};
int main(){
memset(score,0,sizeof(score));
cin>>n;
int x,y;
for(int i=0;i<n;i++) {
cin>>x>>y;
mp[x][y]=1;
a[i][0]=x,a[i][1]=y;
}
for(int i=0;i<n;i++){
x=a[i][0],y=a[i][1];
int flag=1;
for(int j=0;j<4;j++){
if(!mp[x+dir1[j][0]][y+dir1[j][1]]) {
flag=0;
break;
}
}
if(flag){
int s=0;
for(int j=0;j<4;j++){
s+=mp[x+dir2[j][0]][y+dir2[j][1]];
}
score[s]++;
}
}
for(int i=0;i<5;i++)
cout<<score[i]<<endl;
}
3.化学方程式
官网90分:
调了两个小时没调出来
心好累
新知识: unordered_map 可以直接比较是否相同
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<unordered_map>
#define N 1010
using namespace std;
int s_i(string s){
int res=0;
for(int i=0;i<s.length();i++)
res=res*10+(s[i]-'0');
return res;
}
typedef unordered_map<string,int> MPSI; //定义存放原子变量的哈希表
MPSI dfs(const string &s,int &u,int e){
MPSI res;
while(u<e){
if(s[u]==')'){ //应该返回递归了!
u++; //过滤掉)
int i=u;
while(i<s.length()&&isdigit(s[i])) i++;
int k=1; //k记录括号后出现的个数
if(i>u){
k=s_i(s.substr(u,i-u));
u=i;
}
for(auto it:res){
res[it.first]=res[it.first]*k;
}
}
else if(s[u]=='('){ //应该往更深的一层递归了
u++; //过滤(
auto c=dfs(s,u,e);
for(auto it:c){
res[it.first]+=it.second;
}
}
else if(s[u]>='A'&&s[u]<='Z'){//当前是原子
int k=u+1;
while(k<s.length()&&s[k]>='a'&&s[k]<='z') k++; //读取原子名
string key=s.substr(u,k-u);
u=k;
while(k<s.length()&&s[k]>='0'&&s[k]<='9') k++; //读取系数
if(k>u){
res[key]+=s_i(s.substr(u,k-u));
}else{
res[key]+=1;
}
u=k;
}else{ //当前是数字, 既方程式前数字
int k=u;
while(k<s.length()&&s[k]>='0'&&s[k]<='9') k++;
int v=s_i(s.substr(u,k-u)); //读取前导系数
u=k; //u所在位置是( 或者大写字母
if(s[u]=='(') u++;
auto t=dfs(s,u,e);
for(auto c:t){
res[c.first]+=v*c.second;
}
}
}
return res;
}
MPSI solve(const string &s){
MPSI res;
int u=0;
for(int i=0;i<=s.length();i++){
if(i==s.length()||s[i]=='+'){
MPSI t=dfs(s,u,i);
for(auto it:t)
res[it.first]+=it.second;
u++;
}
}
return res;
}
int main(){
int n;
cin>>n;
while(n--){
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='='){
MPSI left=solve(s.substr(0,i));
MPSI right=solve(s.substr(i+1));
// cout<<"===="<<endl;
// for(auto c:left){
// cout<<c.first<<" "<<c.second<<endl;
// }
// for(auto c:right){
// cout<<c.first<<" "<<c.second<<endl;
// }
if(left==right){
cout<<"Y"<<endl;
}else{
cout<<"N"<<endl;
}
break;
}
}
}
}
4.区块链
模拟题,用一个queue模拟链更新状态即可
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
#define N 510
using namespace std;
int s_i(const string &s){
int res=0;
for(int i=0;i<s.length();i++)
res=res*10+s[i]-'0';
return res;
}
struct link{
vector<int> vec; //定义长度和末尾块的值
link(){
vec.push_back(0);
}
bool operator<(const link &lk)const{
if(vec.size()!=lk.vec.size()) return vec.size()<lk.vec.size();
return vec.back()>lk.vec.back();
}
}links[N];
struct node{
int t,pos; //定义到达时间和地点
link lk;
}; //用node+ queue 来存储每个待更新结点
vector<int> G[N]; //存储拓扑图
int n,m,t,k;
int main(){
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
cin>>t>>k;
queue<node> q;
getchar();
while(k--){
string s;
getline(cin,s);
vector<int> arr;
for(int i=0;i<s.length();){
int j=i;
while(j<s.length()&&s[j]!=' ') j++;
arr.push_back(s_i(s.substr(i,j-i)));
i=j+1;
}
while(q.size()&&q.front().t<=arr[1]){
auto fr=q.front();
q.pop();
if(links[fr.pos]<fr.lk){
links[fr.pos]=fr.lk;
for(int i=0;i<G[fr.pos].size();i++){
q.push((node){fr.t+t,G[fr.pos][i],fr.lk});
}
} //先收到链,再产生新块
}
if(arr.size()==2){
cout<<links[arr[0]].vec.size()<<" ";
for(auto it:links[arr[0]].vec)
cout<<it<<" ";
cout<<endl;
}else{
links[arr[0]].vec.push_back(arr[2]);
for(int i=0;i<G[arr[0]].size();i++)
q.push((node){arr[1]+t,G[arr[0]][i],links[arr[0]]});
}
}
}