• Codeforces Round #610 (Div. 2)


    B,

    题意就是你可以一次购买k件衣服,然后你只需付款最贵的那件价格,问你可以最多买多少件。

    #include <bits/stdc++.h>
     
    using namespace std;
    using ll = long long;
    using ld = long double;
     
    int main() {
        int cntTest;
        cin >> cntTest;
        for (int test = 0; test < cntTest; test++) {
            int n, p, k;
            cin >> n >> p >> k;
            int pref = 0;
            int ans = 0;
            vector<int> a(n);
            for (int i = 0; i < n; i++) {
                cin >> a[i];
            }
            sort(a.begin(), a.end());
            for (int i = 0; i <= k; i++) {
                int sum = pref;
                if (sum > p) break;
                int cnt = i;
                for (int j = i + k - 1; j < n; j += k) {
                    if (sum + a[j] <= p) {
                        cnt += k;
                        sum += a[j];
                    } else {
                        break;
                    }
                }
                pref += a[i];
                ans = max(ans, cnt);
            }
            cout << ans << "
    ";
        }
    }
    

    D.Enchanted Artifact

    题意:一个密码锁,密码为长度<=300的,由a和b组成的字符串。每次你输入密码会返回一个耐久,耐久为最小删除/插入/修改的次数使得你输入的密码和答案相同的次数。给你n+2次机会尝试。n不知道。

    题意:首先求出a和b的个数,方法是用300的a和300的b去试,那么a的个数就是300-c1,b的个数就是300-c2。那么len=c1+c2。之后c2表示还缺的b的个数。以len个a的字符串为基准开始试,每次修改一位为b。如果答案比c2小,说明改对了,这位就是b,--c2。如果答案比c2大,说明改错了,这位是a,就改回去,c2不变。最后一共用了n+2次。

    #include<bits/stdc++.h>
    using namespace std;
    const int M=300;
    int main(){
        string s=string(M,'a');
        int c1,c2;
        cout<<s<<endl;cout.flush();
        scanf("%d",&c1);
        c1=300-c1;
        s=string(M,'b');
        cout<<s<<endl;cout.flush();
        scanf("%d",&c2);
        c2=300-c2;
        if (c1==0){
            s=string(c2,'b');
            cout<<s<<endl;cout.flush();
            scanf("%d",&c2);
            return 0;
        }
        else if (c2==0){
            s=string(c1,'a');
            cout<<s<<endl;cout.flush();
            scanf("%d",&c1);
            return 0;
        }
        int len=c1+c2;
        s=string(len,'a');
        int c=0;
        for(int i=0;i<len-1;++i){
            s[i]='b';
            cout<<s<<endl;cout.flush();
            scanf("%d",&c);
            if (c==0)
                return 0;
            if (c>c2)
                s[i]='a';
            else
                --c2;
        }
        
        if(c2)
            s[len-1]='b';
        cout<<s<<endl;cout.flush();
        scanf("%d",&c);
        return 0;
    }
    

      C,就是给你,每个题有0,1,表示容易困难,每道题都有一直t值,表示如果你做题的时间大于等于tt,那你就必须把t值小于等于tt的题做完,你要做出最多的题目数。

    思路就是,我们先给时间从小到大排序一个遍,然后接下来我们就可以进行比较,例如现在处理了i题,已经把时间计算好,再算到i+1的时间可以做几道简单题,这里可以先预先后缀和记录下。

     
    #include <bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    #define cin(a) scanf("%d",&a)
    #define pii pair<int,int>
    #define ll long long
    #define gcd __gcd
    const int inf = 0x3f3f3f3f;
    const int maxn = 200100;
    const int M = 1e9+7;
    int n,m,k,t,x,y;
     
    ll sum[maxn];
     
    struct node
    {
        ll ty,t;
    }a[maxn];
     
    bool cmp(node a,node b)
    {
        return a.t < b.t;
    }
     
    int main()
    {
        cin(t);
        while(t--)
        {
            cin(n);cin(m);cin(x);cin(y);
            for(int i = 0; i < n; i++)
            {
                cin>>a[i].ty;
            }
            for(int i = 0; i < n; i++)
            {
                cin>>a[i].t;
            }
            sort(a,a+n,cmp);
            a[n].t = m+1;
            ll time = 0;
            int res = 0;
     
            for(int i = n-1; i >= 0; i--)
            {
                sum[i] = res;        //求出i题后面有多少个简单题(不包括i)
                if(a[i].ty == 0) res++;
            }
     
            int ans = 0;
            if(a[0].t) ans=min((a[0].t-1)/x,sum[0]);      //在t[0]前面做题
            res=0;
            for(int i = 0; i < n; i++)
            {
                if(a[i].ty==0) time+=x;
                else time+=y;
                if(time<a[i+1].t)
                {
                    res=i+1;
                    res+=min((a[i+1].t-time-1)/x,sum[i]);
                    ans = max(ans,res);
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

     E

    输入一个n,给出n-2个三角形。然后把他们拼成一个多边形,多边形的序号和三角形的序号对应,可以是乱序。输出两个东西,一个是三角形的序号,可以随便以哪个序号开头都可以,第二个东西就是我们按照那种顺序拿。

    例如下面:

    对于第一个问题我们可知道,求出的顶点也就是形成外边的,也就是只用一次的边,所以我们需要的就是记录只用一次的边的顶点,所以我们这里想到了异或,让和这个顶点相连接的每个顶点都和他异或一下,例如上图2连接着5和4两个点,故我们可令e【2】^=5,e【2】^=4,这样一个点如果知道另外一个点就可以通过异或还原出另一个点,所以我们需要的操作就是将每条边用map记录他用几次,

    后面我们随便找出一条用了一次的一条边,就可以找到两个点,接着就可以由两个点得出其他店。

    对于第二个问题,我们知道每个三角形都是一刀切出两个,也就是切的一刀的这条边共用两个三角形,故我们发现一条边用了两次,就将这两个三角形建无向边,再后续dfs输出就行

    #include<bits/stdc++.h>
    using namespace std;
    map<pair<int,int> , vector<int> > m;
    const int N=1e5+7;
    vector<int> p[N];
    int n,e[N];
    void init()
    {
    	for(int i=0;i<=n+1;i++) p[i].clear(),e[i]=0;
    	m.clear();
    }
    void dfs(int u,int f){
    //	cout<<"---"<<u<<endl;
    //	cout<<u<<' ';
    	for(int i=0;i<p[u].size();i++){
    		if(p[u][i]==f) continue;
    		dfs(p[u][i],u);
    	}
    	printf("%d ",u);
    }
    int main()
    {
    	int t ; cin>>t;
    	while(t--){
    		scanf("%d",&n);
    		init();
    		for(int i=1;i<=n-2;i++){
    			int a,b,c;
    			scanf("%d%d%d",&a,&b,&c);
    			if(a>b) swap(a,b);
    			if(b>c) swap(b,c);
    			if(a>b) swap(a,b);
    			e[a]^=b,e[a]^=c;
    			e[b]^=a,e[b]^=c;
    			e[c]^=b,e[c]^=a;
    			m[{a,b}].push_back(i);
    			m[{b,c}].push_back(i);
    			m[{a,c}].push_back(i);
    		}
    		int x,y;
    		for(auto u:m){
    			if(u.second.size()==1){
    				x=u.first.first;
    				y=u.first.second;
    				break;
    			}
    		}
    		printf("%d %d ",x,y);
    		for(int i=1 ;i<=n-2;i++,swap(x,y)) printf("%d ",(x^=e[y]));
    		for(auto u:m){
    			if(u.second.size()==2){
    				p[u.second[0]].push_back(u.second[1]);
    				p[u.second[1]].push_back(u.second[0]);
    			}
    		}
    		puts("");
    //		cout<<"----"<<endl;
    		dfs(1,0);
    		printf("
    ");
    	}
    }
    

      

  • 相关阅读:
    简易的设计模式——观察者模式
    简易的设计模式——桥梁模式
    static与并发
    如何编写优雅的代码:04. 设计模式(中)
    如何编写优雅的代码:03. 设计模式(上)
    如何编写优雅的代码:02. 设计原则
    如何编写优雅的代码:01. 概述
    .Net平台互操作技术:03. 技术验证
    .Net平台互操作技术:02. 技术介绍
    .Net平台互操作技术:01. 主要问题
  • 原文地址:https://www.cnblogs.com/hgangang/p/12095659.html
Copyright © 2020-2023  润新知