D题比较有意思,E题WA了好几发··就是因为情况没考虑全,太惨了·· F倒是简单的有点吓到我
G 思路没问题 但是我排序错了 I’m so vegetable… 只好贴大佬的了
G题对大佬代码添加了注释和思路理解
A
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; cin>>n;
vector<int>a;
for(int i=0;i<n;i++){
int x;
cin>>x; a.push_back(x);
}
vector<int>b; map<int,int>flag;
for(int i=n-1;i>=0;i--){
if(!flag[a[i]]){
b.push_back(a[i]);
flag[a[i]]=1;
}
}
reverse(b.begin(),b.end());
cout<<b.size()<<endl;
for(auto it:b){
cout<<it<<" ";
}
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; string x;
cin>>n>>x;
int res=0,cou=0;
for(int i=0;i<n;i++){
if(x[i]=='x'){
cou++;
}
else{
if(cou>=3)
res+=cou-2;
cou=0;
}
}
if(cou>=3)
res+=cou-2,cou=0;
cout<<res<<endl;
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL a[N],sum[N];
int main()
{
int n,m; cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];
while(m--){
LL x; cin>>x;
LL pos=(lower_bound(sum,sum+n,x)-sum);
if(pos<n){
if(pos>=1)
cout<<pos+1<<" "<<x-sum[pos-1]<<endl;
else
cout<<pos+1<<" "<<x<<endl;
}
else{
cout<<n<<" "<<a[n-1]<<endl;
}
}
return 0;
}
D
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int n; cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
if(n<=2){cout<<0<<endl; return 0;}
int res=n+1;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
int sum=0;
int d=a[1]+j-a[0]-i;//公差
sum+=abs(i)+abs(j);
int now=a[1]+j;//当前值
for(int k=2;k<n;k++){
now=now+d;
if(now-a[k]==1 || a[k]-now==1) sum++;
else if(now==a[k]) ;
else break;
if(k==n-1) res=min(res,sum);
}
}
}
if(res>n) cout<<-1<<endl;
else cout<<res<<endl;
return 0;
}
E
#include <iostream>
using namespace std;
const int N=1e3+10;
int a[N];
int main()
{
int n,w; cin>>n>>w;
int sum=0,maxx=-1,minn=w+1;
for(int i=0;i<n;i++){
cin>>a[i],sum+=a[i];
maxx=max(maxx,sum);
minn=min(minn,sum);
}
minn=max(-minn,0);maxx=min(w-maxx,w);
if(maxx<minn) cout<<0<<endl;
else
cout<<maxx-minn+1<<endl;
return 0;
}
F
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int a[N],k[N],b[N];
int main()
{
int n,m; cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
for(int i=0;i<m;i++){
int x,y; cin>>x>>y;
x--;y--;
if(a[x]>a[y]){
k[x]++;
}
else if(a[x]<a[y])
k[y]++;
}
sort(b,b+n);
for(int i=0;i<n;i++){
int pos=lower_bound(b,b+n,a[i])-b;
if(b[pos]==a[i]) pos--;
cout<<pos-k[i]+1<<" ";
}
cout<<endl;
return 0;
}
G
这题自己没做出来,排序只排了一次,没过。代码是大佬的。附上大佬链接
大佬链接
https://codeforces.com/contest/978/submission/38195700
思路就是贪心 能准备考试就准备考试 当天考试就特判
能够准备就是已经发放考题 所以sort一下 按照发放考题时间排序
然后按照天数枚举,把能够准备的考试都放入set(或者优先队列)
内部排序方式改成 考试时间越靠前 越早开始准备(当天肯定只有一场考试)
然后就分情况讨论 解
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct exam{
int s;
int d;
int c;
int i;
};//开始时间 考试时间 需要的天数 自己的序号
struct stCmp {
bool operator() (const exam *a, const exam *b) const {
return a->d < b->d;
}
};//set内部的排序
set<exam*, stCmp> st;//正在准备的考试
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n, m, i, ans[100];
exam e[100];
memset(ans, 0, 400);
cin >> n >> m;
for (i = 0; i < m; ++i) {
cin >> e[i].s >> e[i].d >> e[i].c;
e[i].i = i + 1;
ans[e[i].d - 1] = m + 1;//预处理一下考试的日子
}
sort(e, e + m, [](exam a, exam b){return a.s < b.s;});//这个写法第一回看到 orz 按照开始的时间排序
int j = 0;
for (i = 1; i <= n; ++i) {
while (e[j].s == i) {//今天有考试发布题目 加入set
st.insert(&e[j]);
++j;
}
if (ans[i - 1] != 0) {//今天是考试的日子
if(!st.empty() && (*st.begin())->d == i) {//但是自己没有复习完
cout << -1;
return 0;
}
}
else if (st.empty())//没有可以复习的考试
ans[i - 1] = 0;
else {
ans[i - 1] = (*st.begin())->i;//今天复习了set里的这一门
if(--(*st.begin())->c == 0)//先自减 复习完了就erase
st.erase(st.begin());
}
}
for (i = 0; i < n; ++i)
cout << ans[i] << ' ';
return 0;
}
/*
大佬链接
https://codeforces.com/contest/978/submission/38195700
*/