注意我是投后台开发的,所以题目不一定和其他岗位相同
先提前声明:我是条ACM铜狗,这次能差点AK很大程度上也是因为这一点。
先上做法,下一楼再上代码
T1 求最小字典序的链表 AC
暴力穷举每条链表
T2 发公告 AC
维护结构体 node 记录每个人的时间间隔、id、下一次能接收的时间。
然后自定义比较器的优先队列。优先选择下一次能接收的时间小的,其次选择编号小的。
T3 俱乐部扣积分 AC
自定义比较器,扣分越大越靠前,扣分相同时截至时间小的靠前。然后用这个比较器 sort 一遍。
sort 完后挨个尝试安放项目,如果时间点 i 已经安过项目了,那下次就往 i 之前的没被安放的时间点放。
T4 能换位的字符串比较 AC
对两个字符串分别做一种特殊的递归操作,然后比较是否相同即可。
递归操作的伪代码:
void part(char* s, int len)
{
// 如果长度为奇数,不能再分,直接返回
if(len&1) return;
// 如果长度为偶数,递归分离
char *b = s+len/2;
part(s, len/2);
part(b, len/2);
// 如果后半部分比前半部分字典序更小,那就交换这俩字符串
if(cmp(s,b,len/2)>0)
strswap(s,b,len/2);
}T5 打地鼠 过90%
暴力DP。
没AC的原因是最后五分钟的时候我才发现题目里还有一句:这轮从a到b,下轮就不能从b到a了。
好了,剩下的时间就是祈祷我不会因为双非本科的学历被刷掉简历了。
各题代码:
T1 AC
struct ListNode {
int val;
struct ListNode *next;
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param S ListNode类 val表示权值,next指向下一个元素
* @return ListNode类
*/
int len;
ListNode* head;
int cmp(ListNode* pta, ListNode* ptb){
ListNode* a = pta;
ListNode* b = ptb;
int cnt = len;
while(cnt--){
if(a->val!=b->val) return a->val-b->val;
a=a->next;
b=b->next;
if(a==nullptr) a=head;
if(b==nullptr) b=head;
}
return 0;
}
void getlen(ListNode* a){
len=0;
ListNode* x = a;
while(x!=nullptr){
x=x->next;
len++;
}
}
ListNode* solve(ListNode* S) {
head = S;
ListNode* ret = S;
getlen(S);
ListNode* p = ret->next;
for(int i=1;i<len;i++, p=p->next){
if(cmp(ret, p)>0)
ret=p;
}
p = ret;
while(len--){
if(p->next == nullptr && len>0){
p->next=head;
}
else
if(len==0){
p->next = nullptr;
}
p=p->next;
}
//p->next=nullptr;
return ret;
}
}; T2 AC
#include <bits/stdc++.h>
using namespace std;
struct node
{
int t;
int id;
int stamp;
bool operator<(const node& other) const {
if(other.stamp!=stamp) return other.stamp<stamp;
else return other.id<id;
}
};
int main()
{
ios::sync_with_stdio(0);
priority_queue<node> q;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
int t;
cin>>t;
q.push(node{t,i,t});
}
while(k--){
node x = q.top();
q.pop();
cout<<x.id<<"\n";
//cout<<x.id<<" "<<x.t<<"\n";
q.push(node{x.t,x.id,x.stamp+x.t});
}
return 0;
} T3 AC
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1000+5;
struct node{
int t;
int val;
}a[MAXN];
bool vis[MAXN];
int cmp(const node& a,const node& b){
if(a.val!=b.val) return a.val>b.val;
else return a.t<b.t;
}
bool putit(int id){
while(id>=1 && vis[id]){
id--;
}
vis[id]=true;
return id!=0;
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].t;
for(int i=1;i<=n;i++) cin>>a[i].val;
for(int i=1;i<=n;i++) vis[i]=false;
sort(a+1,a+n+1,cmp);
int ans =0 ;
for(int i=1;i<=n;i++){
if(!putit(a[i].t)){
//cout<<a[i].val;
//for(int i=1;i<=n;i++) cout<<vis[i];
//cout<<"\n";
ans+=a[i].val;
}
}
cout<<ans<<"\n";
// for(int i=1;i<=n;i++){
// cout<<a[i].t<<" "<<a[i].val<<"\n";
// }
}
int main(){
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--){
solve();
}
return 0;
} T4 AC
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
char sa[MAXN],sb[MAXN];
int cmp(char* a, char* b, int len){
for(int i=0;i<len;i++){
if(a[i]<b[i]) return -1;
else if(a[i]>b[i]) return 1;
}
return 0;
}
void strswap(char* a, char* b, int len){
for(int i=0;i<len;i++){
swap(a[i],b[i]);
}
}
void part(char* s, int len){
// odd
if(len&1) return;
// even
char *b = s+len/2;
part(s, len/2);
part(b, len/2);
if(cmp(s,b,len/2)>0)
strswap(s,b,len/2);
}
bool solve(){
cin>>sa>>sb;
int len = strlen(sa);
if(cmp(sa,sb,len)==0){
return true;
}
if(len&1){
return false;
}
part(sa, len);
part(sb, len);
//cout<<"af a :"<<sa<<"\n";
//cout<<"af b :"<<sb<<"\n";
return cmp(sa,sb,len)==0;
}
int main(){
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--){
cout<<(solve()?"YES\n":"NO\n");
}
return 0;
}
T5 过90%
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15;
int d[MAXN][MAXN];
int f[MAXN][MAXN];
int g[MAXN][MAXN];
int main(){
int n,m,T;
cin>>n>>m>>T;
memset(d,0x3f3f3f3f,sizeof(d));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>d[i][j];
}
}
for(int i=0;i<=MAXN;i++){
for(int j=0;j<=MAXN;j++){
f[i][j]=g[i][j]=-0x3f3f3f3f;
}
}
int t=1;
f[1][1]=0;
for(;t<=T;t++){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
g[i][j]=max(max(f[i-1][j],f[i][j-1]),max(f[i+1][j],f[i][j+1]));
if(t%d[i][j]==0){
g[i][j]++;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j]=g[i][j];
}
}
}
if(f[n][m]>0) cout<<f[n][m];
else cout<<0;
return 0;
}
全部评论
(5) 回帖