铜组T1
铜1题面
很简单的水题吧。。
既然蒟蒻萝卜都过了,那么随便讲两句。
建立数组,下标表示犬编号,里面存犬的状态。每次读入进行比较,若改变,则ans++。
铜1题解
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,y,ans=0;
cin>>n;
int a[20];
for(int i=1;i<=20;i++)
a[i]=-1;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
if (a[x]==-1) a[x]=y;
else if (a[x]!=y) a[x]=y,ans++;
}
cout<<ans;
return 0;
}
铜组T2
铜2题面

一开始蒟蒻萝卜的代码并没有正确,而是按照字母顺序进行比较是否包含,但经过一波生硬的检查,发现了问题。
这是样例图示

铜2题解
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ru[30]={};
int chu[30]={};
char c;
int ans=0;
for(int i=1;i<=52;i++)
{
cin>>c;
if (ru[c-'A'+1]!=0) chu[c-'A'+1]=i;
else ru[c-'A'+1]=i;
}
for(int i=1;i<=26;i++)
for(int j=1;j<=26;j++)
if (ru[i]<ru[j]&&chu[i]>ru[j]&&chu[j]>chu[i])
ans++;
cout<<ans;
return 0;
}
铜组T3
铜3题面
建立结构体,以到达时间升序排序,模拟可过。铜3题解
#include<bits/stdc++.h> using namespace std; struct cow { int t1,t2; }a[110]={}; bool lb(cow x,cow y) { return x.t1<y.t1; } int main() { int n,x,y,t=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i].t1>>a[i].t2; sort(a+1,a+n+1,lb); for(int i=1;i<=n;i++) if (a[i].t1>t) t=a[i].t1+a[i].t2; else t=t+a[i].t2; cout<<t; return 0; }
银组T1
银1题面
蒟蒻萝卜果然还是菜,到银组就各种爆0,MLE,TLE,WA。。。
喜闻乐见。第一题就爆0了。。
QAQ
这题是一道贪心
结构体和数组分别存牛时间段与鸡时间点。
牛以右端点排序。
每只鸡对牛枚举,寻找能帮助的牛就行了银1题解
#include<bits/stdc++.h> using namespace std; int n,c,ans=0; int a[20010]={}; struct cow { int zuo,you; }b[20010]={}; inline bool mycmp(cow a1,cow a2) { return a1.you<a2.you; } inline void init() { cin>>c>>n; for(int i=1;i<=c;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i].zuo>>b[i].you; sort(a+1,a+c+1); sort(b+1,b+n+1,mycmp); } inline void work() { for(int i=1;i<=c;i++) for(int j=1;j<=n;j++) if (a[i]>=b[j].zuo&&a[i]<=b[j].you) { ans++; b[j].zuo=-1; b[j].you=-1; break; } } int main() { init(); work(); cout<<ans; return 0; }
银组T2
银2题面
这题是蒟蒻萝卜翻译的!!!!!
有没有很玄学的,做题时想搓炉石的感觉!
但自己翻译的题蒟蒻萝卜就拿了18分。。。
没脸做萝卜了=_=诶。。
其实只要标记损坏信号灯,从1到k建立一个小框框!!!不停枚举到n-k+1~n每次若最前面一个是损坏的,那么sum-1,若加上的一个损坏的就sum+1;
进行取最小值操作
输出最小灯数。银2题解
#include<bits/stdc++.h> using namespace std; int n,k,b,ans; int a[100010]={}; inline void init() { int x; cin>>n>>k>>b; for(int i=1;i<=b;i++) cin>>x,a[x]=1; } inline void work() { int sum=0; for(int i=1;i<=k;i++) { if (a[i]==1) sum++; } ans=sum; for(int i=k+1;i<=n;i++) { sum=sum+a[i]-a[i-k]; if (sum<ans) ans=sum; } } int main() { memset(a,0,sizeof(a)); init(); work(); cout<<ans; return 0; }
银2反思
其实当时我就想到了这一点,可我只想到了框住之后进行枚举,但这样O(n^2)肯定会TLE然后就没深入思考了,想着一些玄学操作,然后只拿了18分。
银组T3
银3题面
floodfill的变形,不断进行染色,处理边界,暴力搜索就过了。银3题解
#include<bits/stdc++.h> using namespace std; int n,k,r,sum=0,sum1,ans=0; int a[110][110][4];//0下1右2上3左 int b[110][110]; int f[110][110]; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; inline void dfs(int x,int y) { if (x==0||y==0||x==n+1||y==n+1) return; b[x][y]=1; if (f[x][y]==1) sum1++; for(int i=0;i<=3;i++) if (b[x+dx[i]][y+dy[i]]==0&&a[x][y][i]==0) dfs(x+dx[i],y+dy[i]); } inline void read() { int x1,y1,x2,y2,xx,yy; cin>>n>>k>>r; for(int i=1;i<=r;i++) { cin>>x1>>y1>>x2>>y2; if (x1==x2) if (y1>y2) a[x1][y1][3]=1,a[x1][y2][1]=1; else a[x1][y1][1]=1,a[x1][y2][3]=1; else if (x1>x2) a[x1][y1][2]=1,a[x2][y1][0]=1; else a[x2][y1][2]=1,a[x1][y1][0]=1; } for(int i=1;i<=k;i++) cin>>xx>>yy,f[xx][yy]=1; } inline void work() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if (b[i][j]==0) { sum1=0; dfs(i,j); ans+=(k-sum1)*sum1; } cout<<ans/2; } int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(f,0,sizeof(f)); read(); work(); return 0; }