5.27错题总结
wangyichenawm · · 个人记录
T1(P1151 子数整数)
考试思路:直接模拟
考试代码:
#include<bits/stdc++.h>
using namespace std;
int k;
bool pd(int i)
{
int sub1=i%1000;
i/=10;
int sub2=i%1000;
i/=10;
int sub3=i;
if(sub1%k==0&&sub2%k==0&&sub3%k==0)
return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>k;
for(int i=10000;i<=30000;i++)
if(pd(i)==1)
cout<<i<<'\n';
return 0;
}
错误原因:没看到无解就输出No
正确思路:模拟,如果没有解就输出No
正确代码:
#include<bits/stdc++.h>
using namespace std;
int k;
bool flag;
bool pd(int i)
{
int sub1=i%1000;
i/=10;
int sub2=i%1000;
i/=10;
int sub3=i;
if(sub1%k==0&&sub2%k==0&&sub3%k==0)
return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>k;
for(int i=10000;i<=30000;i++)
if(pd(i)==1)
cout<<i<<'\n',flag=1;
if(!flag)
cout<<"No\n";
return 0;
}
T2(P1376 [USACO05MAR] Yogurt factory 机器工厂)
考试思路:骗分
考试代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<<"126900\n";
return 0;
}
错误原因:没时间了
正确思路:加油站问题,每一次可以从之前买过来或者就在这里买
正确代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,s,v[10005],w[10005];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>s;
for(int i=1; i<=n;i++)
cin>>v[i]>>w[i];
int ans=v[1]*w[1],num=v[1];
for(int i=2;i<=n;i++)
{
num=min(v[i],num+s);
ans+=w[i]*num;
}
cout<<ans;
return 0;
}
T3(P6365 [传智杯 #2 初赛] 众数出现的次数)
考试思路:一个一个比较
考试代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],b[1000005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
b[i]^=a[i];
}
int ans=0,sum=0;
for(int i=1;i<=n;i++)
{
int z=0,z1=0;
for(int j=1;j<=n;j++)
{
if(a[j]==a[i]||b[j]==a[i])
z++;
if(a[j]==b[i]||b[j]==b[i])
z1++;
}
if(z==z1)
{
sum=z;
ans=min(a[i],b[i]);
}
if(z>sum)
{
ans=a[i];
sum=z;
}
if(z1>sum)
{
ans=b[i];
sum=z;
}
}
cout<<ans;
return 0;
}
错误原因:TLE
正确思路:把a[i]和b[i]存map里,如果b[i]==a[i],就只加一个a[i],然后找最大值
正确思路:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[1000005],b[1000005];
map<int,int>cnt;
int maxi,ans;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
b[i]=a[i]^b[i];
cnt[a[i]]++;
if(a[i]!=b[i])
cnt[b[i]]++;
}
for(int i=1;i<=n;i++)
{
if(maxi<cnt[a[i]])
{
maxi=cnt[a[i]];
ans=a[i];
}
if(maxi<cnt[b[i]])
{
maxi=cnt[b[i]];
ans=b[i];
}
}
cout<<ans;
return 0;
}
T4(U225113 连接格点)
考试思路:因为横着连比竖着连贵,所以每列之间只连一次横着的
考试代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,jl,jh;
bool vis[1005][1005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>m>>n;
int x1,y1,x2,y2;
while(cin>>x1>>y1>>x2>>y2)
{
if(abs(x2-x1)==1)
{
if(vis[max(x2,x1)][y1]==0)
jh++;
vis[max(x2,x1)][y1]=1;
}
else
{
if(vis[x2][max(y1,y2)]==0)
jl++;
vis[x2][max(y1,y2)]=1;
}
}
int ans=2*(n-1-jl)+(m-1)*n-jh;
cout<<ans;
return 0;
}
错误原因:有多种情况没考虑
正确思路:最小生成树模版,可以把这个矩阵转换成一条线,以此来存数组
正确代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,m,x,y,k,ans;
int x1,yy,x2,y2;
int fa[N];
int find(int x)
{
if(fa[x]==x)
return fa[x];
return fa[x]=find(fa[x]);
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n*m;i++)
fa[i]=i;
while(scanf("%d %d %d %d",&x1,&yy,&x2,&y2)==4)
{
x=(x1 - 1)*m+yy;
y=(x2 - 1)*m+y2;
x=find(x);
y=find(y);
if(x!=y)
{
fa[y]=x;
k++;
}
}
for (int j=1;j<=m;j++)
for (int i=1;i<n;i++)
{
x=find((i-1)*m+j);
y=find(i*m+j);
if(x!=y)
{
fa[y]=x;
k++;
ans++;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<m;j++)
{
x=find((i-1)*m+j);
y=find((i-1)*m+j+1);
if(x!=y)
{
fa[y]=x;
k++;
ans+=2;
}
}
cout<<ans;
return 0;
}
T5(B3851 [GESP202306 四级] 图像压缩)
考试思路:模拟
考试代码:
#include<bits/stdc++.h>
using namespace std;
map<string,int>mp;
int n,m,ss[3][35];
struct N
{
int zh,id;
}a[305];
string s[305]={"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F","10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F","20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F","30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F","40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F","50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F","60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F","70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F","80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F","90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F","A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF","B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF","C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF","D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF","E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF","F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"};
string s2[25];
bool cmp(N x,N y)
{
if(x.zh!=y.zh)
return x.zh>y.zh;
return s[x.id]<s[y.id];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<=255;i++)
mp[s[i]]=i;
for(int i=1;i<=n;i++)
{
cin>>s2[i];
m=s2[i].size();
for(int j=0;j<s2[i].size();j+=2)
{
string s1;
s1=s2[i][j];
s1+=s2[i][j+1];
a[mp[s1]].zh++;
a[mp[s1]].id=mp[s1];
}
}
sort(a,a+256,cmp);
for(int i=0;i<=15;i++)
{
cout<<s[a[i].id];
if(s[a[i].id][0]>9)
ss[1][i]=s[a[i].id][0]-'A'+10;
else
ss[1][i]=s[a[i].id][0]-'0';
if(s[a[i].id][1]>9)
ss[2][i]=s[a[i].id][1]-'A'+10;
else
ss[2][i]=s[a[i].id][1]-'0';
}
cout<<'\n';
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m/2;j++)
{
int mn=1e9,i1=0;
for(int z=0;z<=15;z++)
{
int xx1,xx2;
if(s2[i][2*j]>9)
xx1=s2[i][2*j]-'A'+10;
else
xx1=s2[i][2*j]-'0';
if(s2[i][2*j+1]>9)
xx2=s2[i][2*j+1]-'A'+10;
else
xx2=s2[i][2*j+1]-'0';
int f=xx1*10+xx2,f1=ss[1][z]*10+ss[2][z];
if(mn>abs(f-f1))
{
mn=abs(f-f1);
i1=z;
}
}
if(i1<=9)
cout<<i1;
else
{
char z=(i1+'A'-10);
cout<<z;
}
}
cout<<"\n";
}
return 0;
}
错误原因:大模拟,太费时间,没写完
正确思路:模拟
正确思路:
#include<bits/stdc++.h>
using namespace std;
int toint(char c)
{
if (c>='A'&&c<='F')
return c-'A'+10;
return c-'0';
}
int a[25][25];
struct node
{
int hd;
int sl;
}c[300];
void myprint(int x)
{
char c;
if (x>9)
c='A'+x-10;
else
c=x+'0';
cout<<c;
}
bool cmp(node x,node y)
{
if (x.sl==y.sl) return x.hd<y.hd;
return x.sl>y.sl;
}
int main()
{
int n;
cin>>n;
string s;
for(int i=1;i<=n;i++)
{
cin>>s;
int t;
for(int j=0;j<s.size();j+=2)
{
t=toint(s[j])*16+toint(s[j+1]);
a[i][j/2+1]=t;
c[t].sl++;
}
}
for (int i=1;i<=255;i++)
c[i].hd=i;
sort(c,c+256,cmp);
for (int i=0;i<16;i++)
{
myprint(c[i].hd/16);
myprint(c[i].hd%16);
}
cout<<endl;
int len=s.length()/2;
for(int i=1;i<=n;i++)
{
for (int j=1;j<=len;j++)
{
int cha=256;
int p=0;
for (int k=0;k<=15;k++)
{
if (abs(c[k].hd-a[i][j])<cha)
{
cha=abs(c[k].hd-a[i][j]);
p=k;
}
}
myprint(p);
}
cout<<endl;
}
return 0;
}