A:题意:抹除重复元素 留下最后一个不相同元素 输出
水题
#include <iostream> using namespace std; int main() { int a[1005],n; while(cin>>n) { int vis[1005]={0}; for(int i=0;i<n;i++) { cin>>a[i]; } int j=0,cas[1005],t=0; for(int i=n-1;i>=0;i--) { if(!vis[a[i]]) { cas[j++]=a[i]; } vis[a[i]]=1; } cout<<j<<endl; for(int i=j-1;i>=0;i--) { cout<<cas[i]<<" "; } cout<<endl; } return 0; }B:题意:
不能有连续超过三个X 输出需要移除个数
#include<bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { int num=0; char s[105]; cin>>s; for(int i=0;i<n;i++) { if(s[i]=='x'&&s[i+1]=='x') { while(s[i+2]=='x') { num++; int j; for( j=i+2;j<n-1;j++) { s[j]=s[j+1]; } s[j]='\0'; } } } cout<<num<<endl; } }
C:读不懂题就溜了,现在看很简单
题意:给你room的总id,判断它在那个dormitory的第几个room
方法:前缀和+lower_bound
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n,m; while(cin>>n>>m) { ll sum[200005]; sum[0]=0; for(int i=1;i<=n;i++) { ll c; cin>>c; sum[i]=sum[i-1]+c; } for(int i=0;i<m;i++) { ll c; cin>>c; ll t=lower_bound(sum+1,sum+1+n,c)-sum; ll tt=c-sum[t-1]; cout<<t<<" "<<tt<<endl; } } return 0; }
D:
题意:数列,经过变化是否为等差数列。变化是:+1,-1或者不动(针对每一个元素)
方法:整体判肯定超时。实质上是散点变化后拟合问题。根据a[1]-a[0求出来差去判断后面的(部分之间的关系)。a[1]-a[0]一共也就9种情况。然后用差去拟合即可。
#include <bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { int a[100005]; for(int i=0;i<n;i++) { cin>>a[i]; } int ans=0x3f3f3f3f; int yes=0; for(int i=-1;i<=1;i++) { for(int j=-1;j<=1;j++) { int cnt=abs(i)+abs(j); int dif=a[1]+i-a[0]-j; int cur=a[1]+i; int flag=0; for(int k=2;k<n;k++) { cur+=dif; if(abs(cur-a[k])>1) { flag=1; break; } else { cnt+=(abs(cur-a[k])); } } if(!flag) { yes=1; ans=min(cnt,ans); } } } if(yes) { cout<<ans<<endl; } else { cout<<-1<<endl; } } return 0; }
E:
扫描二维码关注公众号,回复:
1074560 查看本文章
题意
一辆车容量为W,给你上下车人数,判断初始人数的可能性
方法
想象一个数轴,求出最左端和最右端即可。
用到了前缀和。
#include <bits/stdc++.h> using namespace std; int main() { int n,w,a[1005]; while(cin>>n>>w) { int sum[1005]; sum[0]=0; for(int i=1;i<=n;i++) { cin>>a[i]; sum[i]=sum[i-1]+a[i]; } int num=0; int mi=0,ma=0; for(int i=1;i<=n;i++) { ma=max(ma,sum[i]); mi=min(mi,sum[i]); } int ans=w-ma-abs(mi)+1;//w-ma计算出上界,减去abs[mi]再加1即为区间的长度。 ans=max(0,ans); cout<<ans<<endl; } return 0; }F:
题意
若ra>rb且不吵架,那么a可以作为b的领导,输入其可以作为几个人的领导。
方法
暴力肯定超时。若没有不吵架这个选项,那lower_bound 即可,但有了。那我们可以从原本个数减去吵架的即可。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long #define fo freopen("in.txt","r",stdin) #define fc fclose(stdin) #define fu0(i,n) for(i=0;i<n;i++) #define fu1(i,n) for(i=1;i<=n;i++) #define fd0(i,n) for(i=n-1;i>=0;i--) #define fd1(i,n) for(i=n;i>0;i--) #define mst(a,b) memset(a,b,sizeof(a)) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d %d",&n,&m) #define ss(s) scanf("%s",s) #define sddd(n,m,k) scanf("d%d",&n,&m,&k) #define pans() printf("%d\n",ans) #define all(a) a.begin(),a.end() const int maxn=200005; const double eps=1e-8; int a[maxn],ans[maxn],i,b[maxn],cnt[maxn]; int main() { int n,m; while(~sdd(n,m)) { fu1(i,n) { sd(a[i]); b[i]=a[i]; } int u,v; sort(a+1,a+n+1); mst(cnt,0); fu1(i,m) { sdd(u,v); if(b[u]>b[v]) cnt[u]++; else if(b[u]<b[v]) cnt[v]++; } fu1(i,n) { ans[i]=lower_bound(a+1,a+n+1,b[i])-a-1-cnt[i]; cout<<ans[i]<<" "; } cout<<endl; } return 0; }G:
题意
N天M场考试,每场考试可以分为(知道信息bg,复习lg,考试ed)三个状态,输出N天干什么。
方法
ans 初始化为0 考试那天必定输出m+1
区间贪心即可:按照截至时间排序,若对于每一场考试 sta---ed 之间可以使ti减为0,填进去id即可,否则输出-1;
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long //#define fo freopen("in.txt","r",stdin) #define fc fclose(stdin) #define fu0(i,n) for(i=0;i<n;i++) #define fu1(i,n) for(i=1;i<=n;i++) #define fd0(i,n) for(i=n-1;i>=0;i--) #define fd1(i,n) for(i=n;i>0;i--) #define mst(a,b) memset(a,b,sizeof(a)) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d %d",&n,&m) #define ss(s) scanf("%s",s) #define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k) #define pans() printf("%d\n",ans) #define all(a) a.begin(),a.end() const int maxn=200005; const double eps=1e-8; struct exam { int sta,ed,ti,id; }; exam e[105]; bool operator<(exam a,exam b) { return a.ed<b.ed; } int main() { int n,m; while(~sdd(n,m)) { // getchar(); int i; int ans[105]={0}; fu1(i,m) { sddd(e[i].sta,e[i].ed,e[i].ti); e[i].id=i; ans[e[i].ed]=m+1; } sort(e+1,e+m+1); int flag=0; fu1(i,m) { for(int j=e[i].sta; j<e[i].ed&&e[i].ti; j++) { if(ans[j]==0) { ans[j]=e[i].id; e[i].ti--; } } if(e[i].ti) { cout<<-1<<endl; flag=1; break; } } if(!flag) fu1(i,n) { cout<<ans[i]<<' '; } cout<<endl; } return 0; }