- 伍衍 的博客
DAY3
- @ 2024-7-10 20:26:20
考试错误:无,一遍的。
思路:
.特判:n = 1,2时需要进行特判。 .如果数量不相等(全一样输出2),输出1。 .否则输出2(特判另算 )。
代码:
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
signed main(){
freopen("change.in","r",stdin);
freopen("change.out","w",stdout);
int n;
cin >> n;
string s;
cin >> s;
if(n==1){
cout << 0;
return 0;
}
else if(n==2){
if(s[0]==s[1]) cout << 0;
else cout << -1;
return 0;
}
int cnt0=0,cnt1=0;
for(int i=0;i<s.size();i++){
if(s[i]=='0') cnt0++;
else cnt1++;
}
if(cnt0==cnt1) cout << 2;
else if(cnt1==n||cnt0==n) cout << 0;
else cout << 1;
}
错误原因:完全不会。
思路:
一道大模拟,我们先要把时间和路程分别加入到两个栈中并排序,随后将时间转化成路程,最后再算出答案即可。
代码:
#include <bits/stdc++.h>
#define int double
using namespace std;
vector<int> tt,dd;
double v=1;
signed main(){
freopen("snow.in","r",stdin);
freopen("snow.out","w",stdout);
int n;
cin >> n;
for(int i=1;i<=n;i++){
char c;
int x;
cin >> c >> x;
if(c=='T') tt.push_back(x);
else dd.push_back(x);
}
int xt=0,xd=0;
double T=0,D=0;
sort(tt.begin(),tt.end());
sort(dd.begin(),dd.end());
tt.push_back(2e9);
dd.push_back(2e9);
while(xt<tt.size()-1||xd<dd.size()-1){
double s=1/v;
v++;
double dist=D+(tt[xt]-T)*s;
if(dist<dd[xd]){
D=dist,T=tt[xt];
xt++;
}
else{
T=T+(dd[xd]-D)/s;
D=dd[xd];
xd++;
}
}
T+=(1000-D)*v;
cout << (long long)(T+0.5);
}
考试错误:错误的按排序,导致错误。
思路:
.排序(cmp:a.t×b.d<a.d×b.t)。
.用一个后缀和数组储存每次赶牛时剩下牛会吃多少草。
.循环从-,每次用a[i]*s[i+1],把乘积加入到sum里面。
.输出sum。
代码:
#include<bits/stdc++.h>
using namespace std;
struct str{
long long t,d;
};
str a[200005];
long long s[200005];
bool cmp(str x,str y){
return x.t*y.d<x.d*y.t;
}
int main(){
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].t>>a[i].d;
}
sort(a+1,a+1+n,cmp);
long long sum=0,k=0;
for(int i=1;i<=n;i++){
sum+=a[i].d*k;
k+=2*a[i].t;
}
cout<<sum;
return 0;
}
考试错误:骗分的,没有发生错误。
思路:
.输入。
.枚举两个数组,并获取字典序。
.用归并的思想去组合数字,注意要按字典序。
.输出。
代码:
#include<bits/stdc++.h>
using namespace std;
int cmp(vector<int> a,int ida,vector<int> b,int idb){
int len1=a.size(),len2=b.size();
while(ida<len1&&idb<len2) {
if(a[ida]!=b[idb]) return a[ida]>b[idb];
ida++,idb++;
}
if(ida<len1) return 1;
else return 0;
}
vector<int> get(vector<int> a,int k){
int n=a.size();
if(n<=k)return a;
int t=n-k;
vector<int> stk;
for(int i=0;i<n;i++){
while(stk.size()>0&&stk.back()<a[i]&&t>0){
stk.pop_back();
t--;
}
if(stk.size()<k)stk.push_back(a[i]);
else t--;
}
return stk;
}
vector<int> merge(vector<int> a,vector<int> b){
int len1=a.size(),len2=b.size();
vector<int> res;
int i=0,j=0;
while(i<len1&&j<len2) {
if(a[i]>b[j]) res.push_back(a[i++]);
else if(a[i]<b[j]) res.push_back(b[j++]);
else{
if(cmp(a,i,b,j)>0) res.push_back(a[i++]);
else res.push_back(b[j++]);
}
}
while(i<len1) res.push_back(a[i++]);
while(j<len2) res.push_back(b[j++]);
return res;
}
int main(){
freopen("big.in","r",stdin);
freopen("big.out","w",stdout);
int n,m,k;
cin >> n >> m >> k;
vector<int> a,b;
for(int i=1;i<=n;i++) {
int x;
cin>>x;
a.push_back(x);
}
for(int i=1;i<=m;i++) {
int x;
cin>>x;
b.push_back(x);
}
vector<int> ans(k,0);
for(int i=0;i<=k;i++) {
int len1=i,len2=k-i;
vector<int> tmp1=get(a,len1);
vector<int> tmp2=get(b,len2);
vector<int> res=merge(tmp1,tmp2);
if(res.size()==k&&cmp(res,0,ans,0)>0) ans=res;
}
for(auto x:ans){
cout<<x;
}
}
考试错误:对dijkstra算法理解的不深刻,导致没有做出来。
思路:
模板题,只改了一两句,但是很难想出怎么改。(具体改法见代码)。
易错点:在赋值数组时要用循环赋值,不能直接(我也不知道为啥,反正改了AC ,不改RE)。
代码:
#include <bits/stdc++.h>
using namespace std;
int arr[2005][2005],n,m,e,s;
double dist[2005];
bool v[2005];
void dijkstra(){
for(int i=1;i<=n;i++) dist[i]=0x3f3f3f3f;
dist[s]=100;
for(int i=1;i<=n;i++){
int x=-1;
for (int j=1;j<=n;j++){
if(!v[j]&&(x==-1||dist[j]<dist[x])) x=j;
}
v[x]=1;
for(int y=1;y<=n;y++){
if(arr[x][y]<200&&dist[x]/(1-arr[x][y]*0.01)<dist[y]){
dist[y]=dist[x]/(1-arr[x][y]*0.01);
}
}
}
}
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
cin >> n >> m;
memset(arr,0x3f,sizeof(arr));
for(;m--;){
int x,y,z;
cin >> x >> y >> z;
arr[x][y]=z;
arr[y][x]=z;
}
cin >> e >> s;
dijkstra();
printf("%.8lf",dist[e]);
}
考试错误:题,没做出来。
思路:
.每遇到一个,我们就统计这个前面的数量和后面的数量,这个能组成的数量就是前面的数×后面的数。
.所以我们只需用两个变量存储这个前面的数量和后面的数在相加即可。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
freopen("wow.in","r",stdin);
freopen("wow.out","w",stdout);
string s;
cin >> s;
long long wow1=0,wow2=0,wow3=0;
for(int i=0;i<s.size();i++){
if(s[i]=='o')wow2+=wow1;
else if(s[i-1]=='v'){
wow3+=wow2;
wow1++;
}
}
cout << wow3;
return 0;
}