周报

这一周就是不断的在训练,打打牛客,codeforces,pta上的比赛。马上就要蓝桥杯,天梯等比赛了,往后训练要继续加强,希望能在比赛中拿到好成绩

天梯的这道题,有点像二分,方法是非常巧妙的,相当于根据输入倒着来推结果,判断每一次的值是在前半段还是后半段,之后根据不同情况作出最后处理,一直到最后的结果

include<bits/stdc++.h>

//#include "vector"
using namespace std;

define endl '\n'

define PII pair<int,int>

define int unsigned long long

void solve() {
int n, k;
cin >> n >> k;
int dq;
// if (n == 64) {
// dq = (((1ull << 63) - 1ull) + (1ull << 63));
// }
// else
dq = (1ull << n) - 1;
vector ans;
while (dq > 1) {
if (dq / 2 >= k) {
ans.push_back(0);
dq /= 2;
} else {
k = (dq - k);
ans.push_back(1);
dq /= 2;
}
}
std::reverse(ans.begin(), ans.end());
string s;
if (k == 0) {
s = "0";
} else s = "1";
for (int i = 0; i < ans.size(); ++i) {
if (ans[i] == 0) {
s = '0' + s;
} else s = '1' + s;
}
cout << s << endl;
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0);
int t=1;
for (int i = 0; i <t ; ++i) {
solve();
}
}

这道题就是如何排序,就算使用快排也还是会超时,这个时候就用到另一种排序的方法,对于两个有序的数组进行排序,复杂度达到了O(n)
把两个有序数组合并一下

merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

include

include "iostream"

include "vector"

include "cmath"

include "queue"

include "algorithm"

define int long long

using namespace std;
struct node{
int id,shili,num;
};
bool compare(struct node a,struct node b){
if(a.num!=b.num)
return a.num>b.num;
else
return a.id<b.id;
}
int n,m,k;
cin>>n>>m>>k;
vector vt(2n);
for(int i=0;i<2
n;i++)
cin>>vt[i].num,vt[i].id=i+1;
for(int i=0;i<2*n;i++)
cin>>vt[i].shili;
sort(vt.begin(),vt.end(),compare);
while(m--){
vector win,lose;
for(int i=0;i<vt.size();i+=2){
if(vt[i].shili<vt[i+1].shili){
vt[i+1].num++;
win.emplace_back(vt[i+1]);
lose.emplace_back(vt[i]);
}
else
{
vt[i].num++;
win.emplace_back(vt[i]);
lose.emplace_back(vt[i+1]);
}
}
merge(win.begin(),win.end(),lose.begin(),lose.end(),vt.begin(),compare);
// cout<<vt[k-1].id<<'\n';
}
cout<<vt[k-1].id;
}

这道题当时写的是超时,但是分数还是有17分,还是比较容易骗分的。看的那个题解用的是水桶排序,感觉有点像模拟吧,用水桶来标记一个数有没有被选过

include

include "iostream"

include "vector"

include "cmath"

include "queue"

include "algorithm"

define int long long

using namespace std;
struct node{
int id,shili,num;
};
bool compare(struct node a,struct node b){
if(a.num!=b.num)
return a.num>b.num;
else
return a.id<b.id;
}
int tong[1000006],t[1000006],k[1000006];
vector s[100006];
int js = 0;
int qwq;
int n;
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>t[i]>>k[i];
for(int j=1;j<=k[i];j++){
int a;
cin>>a;
s[i].push_back(a);
}
}
int l=1;
for(int i=1;i<=n;i++){
while(t[i]-t[l]>=86400){
for(int j=0;j<s[l].size();j++){
tong[s[l][j]]--;
if(tong[s[l][j]]0)
js--;
}
l++;
}
for(int j=0;j<s[i].size();j++){
tong[s[i][j]]++;
if(tong[s[i][j]]
1)
js++;
}
cout<<js<<'\n';
}

return 0;

}

这个是天梯赛的一道题,做的时候头都大了。也是看了题解发现这一题用的是贪心。先拿111去除,根据余数*10+1,然后用一个vector记录下来,依次输出

include <bits/stdc++.h>

define int long long

using namespace std;
signed main()
{
int n;
cin>>n;
if(n==1){
cout<<"1 1";
return 0;
}
int num=2;
int y=111%n;
int u=111/n;
bool f=false;
while(y){
if(u!=0)
f=true;
if(f)
cout<<u;
y=y*10+1;
num++;
u=y/n;
y=y%n;
}
cout<<u<<' '<<num+1;
}

这道题感觉自己脑子瘫了,一直在挖,比赛完才发现问题


这道题当时做的时候其实是知道使用并查集的,唯一卡的地方就是如何判断环,赛后跟同学讨论才想到可以用图的端点和边来判断。如果端点数和边书相等则有环存在。所以只需要用深搜来记录经过的边数就可以了。

posted @ 2024-03-24 15:39  niubuniu  阅读(5)  评论(0编辑  收藏  举报