这种凌晨场真的折寿
就过了四题,8wa结尾心态炸裂,求别被hack,再hack就要爬了
A2 B8 C38(1) E1:58(7)
D题感觉可以写,但是没有时间看了。幸好E最后发现了自己的错误。
A题:看到题的时候感觉好温馨,算时间,感动到了
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 using namespace std; 11 #define ll long long 12 #define inf 0x3f3f3f3f 13 #define mod 1000000007 14 const int maxn=1e5+10; 15 int main() 16 { 17 int t; 18 scanf("%d",&t); 19 while(t--){ 20 int n,m; 21 cin>>n>>m; 22 int sum=60-m+(23-n)*60; 23 printf("%d ",sum); 24 } 25 return 0; 26 }
B题:看到题的那一刻,又感动到了
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 using namespace std; 11 #define ll long long 12 #define inf 0x3f3f3f3f 13 #define mod 1000000007 14 const int maxn=1e5+10; 15 int main() 16 { 17 int t; 18 scanf("%d",&t); 19 while(t--){ 20 int n,m; 21 cin>>n>>m; 22 int zx=n/m,ge=m/2; 23 int sheng=n-zx*m; 24 if(sheng>=ge){ 25 printf("%d ",zx*m+ge); 26 } 27 else{ 28 printf("%d ",zx*m+sheng); 29 } 30 } 31 return 0; 32 }
C题:这题是hack最多的 QAQ求求求了别注意到我
题意:给n个数字,0或者1~n之间,把0替换成1~n中没出现过的,同时满足不等于它所在的位置下标
思路:暴力……?感觉自己要被hack的……但算了算复杂度没超
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 using namespace std; 11 #define ll long long 12 #define inf 0x3f3f3f3f 13 #define mod 1000000007 14 const int maxn=2e5+10; 15 int a[maxn],pos[maxn]={0},p[maxn]; 16 int main() 17 { 18 int n; 19 queue<int>q; 20 scanf("%d",&n); 21 int t=0; 22 for(int i=1;i<=n;i++){ 23 scanf("%d",&a[i]); 24 if(!a[i]){ 25 p[t++]=i; 26 } 27 else{ 28 pos[a[i]]=1; 29 } 30 } 31 for(int i=1;i<=n;i++){ 32 if(!pos[i]){q.push(i);} 33 } 34 for(int i=0;i<t-2;i++){ 35 int wei=q.front();q.pop(); 36 if(wei!=p[i]){ 37 a[p[i]]=wei; 38 } 39 else{ 40 q.push(wei); 41 wei=q.front();q.pop(); 42 a[p[i]]=wei; 43 } 44 } 45 int wei=q.front();q.pop();int wei2=q.front(); 46 if(p[t-1]!=wei && p[t-2]!=wei2){ 47 a[p[t-1]]=wei;a[p[t-2]]=wei2; 48 } 49 else{ 50 a[p[t-2]]=wei;a[p[t-1]]=wei2; 51 } 52 for(int i=1;i<=n;i++){ 53 printf(i==n?"%d ":"%d ",a[i]); 54 } 55 return 0; 56 }
E题:这是我wa最多,花时间找错误最多的
题意:给一个n,输入n个数(1~n),代表人所在的房子序号,人可以左右移动一格或者不动,但只能移动一次。问最小,最多的可以住不同的房子
思路:缩小,扩大,扩大考虑房子序号出现次数1次,2次,大于等于3次,优先考了右边,然后是不动,再是左边。缩小,遇到房子序号出现次数为0的跳过,遇到不是0的,考虑111,101,110,100四种情况即可。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 using namespace std; 11 #define ll long long 12 #define inf 0x3f3f3f3f 13 #define mod 1000000007 14 const int maxn=2e5+10; 15 int a[maxn]={0},vis[maxn]={0},pos[maxn]={0},k; 16 int main() 17 { 18 int n; 19 int sum=0,ans=0; 20 scanf("%d",&n); 21 for(int i=0;i<n;i++){ 22 scanf("%d",&k); 23 pos[k]++; 24 vis[k]++; 25 } 26 for(int i=1;i<=n;i++){ 27 if(pos[i]==1){ 28 if(!a[i-1]){a[i-1]=1;} 29 else if(!a[i]){a[i]=1;} 30 else if(!a[i+1]){a[i+1]=1;} 31 } 32 else if(pos[i]==2){ 33 if(!a[i-1]){ 34 a[i-1]=1; 35 if(!a[i]){a[i]=1;} 36 else if(!a[i+1]){a[i+1]=1;} 37 } 38 else{ 39 a[i]=1; 40 a[i+1]=1; 41 } 42 } 43 else if(pos[i]>=3){ 44 a[i]=1;a[i-1]=1;a[i+1]=1; 45 } 46 } 47 for(int i=0;i<=n+1;i++){if(a[i]){sum++;}} 48 for(int i=1;i<=n;i++){ 49 if(vis[i] && vis[i+2] && vis[i+1]){ 50 ans++;i=i+2; 51 } 52 else if(vis[i] && vis[i+1] && !vis[i+2]){ 53 ans++;i=i+2; 54 } 55 else if(vis[i] && !vis[i+1] && vis[i+2]){ 56 ans++;i=i+2; 57 } 58 else if(vis[i] && !vis[i+1] && !vis[i+2]){ 59 ans++;i=i+2; 60 } 61 62 } 63 printf("%d %d ",ans,sum); 64 return 0; 65 }
D和F等期末考完再补吧。希望期末全过啊
upd
补题D题:
题意:给n个树的位置,求m个人离树最小的距离之和
思路:往外扩,bfs
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 using namespace std; 11 #define ll long long 12 #define inf 0x3f3f3f3f 13 #define mod 998244353 14 const int maxn=2e5+10; 15 struct node{ 16 int n,m; 17 node(){} 18 node(int nn,int mm):n(nn),m(mm){} 19 }; 20 map<int,bool>vis; 21 queue<node>q; 22 int pos[maxn],t=0,n,m,k; 23 ll bfs(){ 24 ll ans=0; 25 while(m>0 && !q.empty()){ 26 node tk=q.front();q.pop(); 27 if(!vis[tk.n]){ 28 ans+=(ll)tk.m;pos[t++]=tk.n;m--;vis[tk.n]=1; 29 q.push(node(tk.n+1,tk.m+1)); 30 q.push(node(tk.n-1,tk.m+1)); 31 } 32 } 33 return ans; 34 } 35 int main() 36 { 37 scanf("%d%d",&n,&m); 38 for(int i=0;i<n;i++){ 39 scanf("%d",&k); 40 vis[k]=1;q.push(node(k+1,1));q.push(node(k-1,1)); 41 } 42 printf("%lld ",bfs()); 43 for(int i=0;i<t;i++){ 44 printf(i==t-1?"%d ":"%d ",pos[i]); 45 } 46 return 0; 47 }
前几天一直练搜索题……比赛时候搜索题题目都没看……
F题的题意有点难懂
就是给n个1~n的点,第i个点的价值是2^i(0<i<n+1),每个点链接的线,有一个主点和副点,主点的价值等于主点的价值加上其所有的副点价值(包含副点的副点价值等等)
给n-1个数字a,代表价值从大到小的主点位置,求线段两点的价值从大到小的位置
题解,感觉有点像拓扑排序,入度点,并且要求小的先出,所以用优先队列
还是看了别人的题解写的,呜呜呜,题意根本没读懂
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<vector> 9 #include<queue> 10 #define mem(a,b) memset(a,b,sizeof(a)) 11 using namespace std; 12 #define ll long long 13 #define inf 0x3f3f3f3f 14 #define mod 998244353 15 const int maxn=2e5+10; 16 int vis[maxn],du[maxn],a[maxn]; 17 vector<pair<int,int> > v; 18 priority_queue<int,vector<int>,greater<int> >q; 19 int n; 20 int main() 21 { 22 cin>>n; 23 for(int i=1;i<n;i++){ 24 cin>>a[i]; 25 vis[a[i]]=1,du[a[i]]++; 26 } 27 for(int i=1;i<=n;i++){ 28 if(!vis[i]){q.push(i);} 29 } 30 for(int i=n-1;i;i--){ 31 int t=q.top();q.pop(); 32 du[a[i]]--; 33 v.push_back(make_pair(t,a[i])); 34 if(!du[a[i]]){q.push(a[i]);} 35 } 36 printf("%d ",a[1]); 37 for(int i=n-2;i>=0;i--){ 38 printf("%d %d ",v[i].first,v[i].second); 39 } 40 return 0; 41 }