codeforce_div3_round 481 ABCDEFG

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

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值