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(" "); } }