- 伍衍 的博客
DAY8
- @ 2024-7-17 9:03:04
考试错误:无。
思路:
∵2x%m=1&&x<m;
∵2x%m=1;
∴(2x-1)%m=0;
∵x<m;
∴2x-1=m;
∴x=(m+1)/2;
代码:
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
signed main(){
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
int m;
cin >> m;
cout << (m+1)/2;
}
考试错误:暂时不知道哪有问题
思路:
这是一道模拟题,用逆向思维来求出吃不了草的天数,再用减去吃不了草的天数即可。
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=1e5+50;
int d[N],b[N];
signed main(){
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
int n,t;
cin >> n >> t;
int res=0,ans=0;
for(int i=1;i<=n;i++){
cin >> d[i] >> b[i];
if(res>=d[i]) res+=b[i];
else ans+=(d[i]-res-1),res=d[i]+b[i]-1;
}
int zero=0;
ans+=min(zero,t-res);
cout << t-ans;
}
考试错误:暴力骗了分,没有发生错误。
思路:
.用前缀和数组和后缀和数组辅助求和。
.使用二分找出最后一个的数。
.最后求出答案。
代码:
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=1e5+50;
pair<int,int> f[N];
int pre[N],suf[N];
signed main(){
freopen("cat.in","r",stdin);
freopen("cat.out","w",stdout);
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> f[i].y;
}for(int i=1;i<=n;i++){
cin >> f[i].x;
}
sort(&f[1],&f[n+1]);
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+f[i].x*f[i].y;
}for(int i=n;i>=1;i--){
suf[i]=suf[i+1]+f[i].y;
}
int q;
cin >> q;
while(q--){
int k;
cin >> k;
int l=0,r=n;
while(l<r){
int mid=(l+r>>1)+1;
if(f[mid].x<=k) l=mid;
else r=mid-1;
}
cout << suf[l+1]*k+pre[l] << endl;
}
}
考试错误:没有时间了,所以没去做这道题,下次要提高做题速度。
思路:
后面自己做了一下,是一道模拟题,只需注意在处理退格键时要用一个栈,其他按题目要求来就行。
代码:
#include <bits/stdc++.h>
using namespace std;
vector<string> vcr,vcr2;
int main(){
freopen("key.in","r",stdin);
freopen("key.out","w",stdout);
string s;
while(getline(cin,s)){
if(s=="EOF") break;//结束
if(s=="") continue;//多余行
vector<char> t;
for(int i=0;i<s.size();i++){
if(s[i]=='<'&&t.size()) t.pop_back();//退格
if(s[i]!='<') t.push_back(s[i]);//防止光标在第一位时误加的情况
}
string x;
for(int i=0;i<t.size();i++) x=x+t[i];
if(x.size()) vcr.push_back(x);//全是退格时的情况
}while(getline(cin,s)){
if(s=="EOF") break;
if(s=="") continue;
vector<char> t;
for(int i=0;i<s.size();i++){
if(s[i]=='<'&&t.size()) t.pop_back();
if(s[i]!='<') t.push_back(s[i]);
}
string x;
for(int i=0;i<t.size();i++) x=x+t[i];
if(x.size()) vcr2.push_back(x);
}
double d;
cin >> d;
double cnt=0;
for(int i=0;i<vcr.size()&&i<vcr2.size();i++){
for(int j=0;j<vcr[i].size()&&j<vcr2[i].size();j++){
if(vcr[i][j]==vcr2[i][j]){
cnt+=1;
}
}
}
cout << (long long)((60/d*cnt)+0.5);
}
考试错误:对模拟的运用还不够,没有看出是一道模拟题。
思路:
这是一道模拟题,用两个循环模拟奶牛向左和向右冲,随后在能冲出去的那一边加干草,如果两边都能冲出去,输出。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
pair<int,int> a[N];
bool cmp(pair<int,int> a,pair<int,int> b){
return a.second<b.second;
}
signed main(){
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
int jd=0xffffffff;
int n,b;
cin >> n >> b;
for(int i=1;i<=n;i++){
cin >> a[i].first >> a[i].second;
}
sort(a+1,a+n+1,cmp);
if(b>a[n].second||b<a[1].second){
cout << -1;
return 0;
}
int q=0,w=0,l=0,r=0;
for(int i=1;i<=n;i++){
if(a[i].second>b){
w=i,q=i-1;
break;
}
}
l=q,r=w;
while(l>=1){
while(a[r].second-a[l].second>a[r].first&&r<=n){
r++;
}
if(r>n) break;
jd=min(jd,a[r].second-a[l].second-a[l].first);
l--;
}
l=q,r=w;
while(r<=n){
while(a[r].second-a[l].second>a[l].first&&l>=1){
l--;
}
if(l<1) break;
jd=min(jd,a[r].second-a[l].second-a[r].first);
r++;
}
if(jd==0xffffffff) cout << -1;
else cout << max(jd,0ll);
return 0;
}