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 << "\n";
}
}
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("\n");
}
}
浙公网安备 33010602011771号