周赛 – Wasting_Misaka.Blog https://forelink.top Hso! Sun, 14 May 2023 06:46:02 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.1 第五次双周赛(week 16) https://forelink.top/index.php/2023/05/14/%e7%ac%ac%e4%ba%94%e6%ac%a1%e5%8f%8c%e5%91%a8%e8%b5%9b%ef%bc%88week-16%ef%bc%89/ Sun, 14 May 2023 06:46:02 +0000 https://forelink.top/?p=180 T1 计算摄氏温度(签到)

题目:

代码:

#include <iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	double p = 5*(n-32)/9;
	printf("Celsius = %d",(int)p);
	return 0;
}

T2 查验身份证(模拟)

题目:

样例:

数学不好,题都要读不懂了(什么是权重啊呜呜)

代码:

#include <iostream>
using namespace std;
const int mod = 11;
string a;
char m[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int q[19]={0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
bool check(int z,char c){
	if(m[z]!=c)	return false;
	return true;
}
int main(){
	bool all=true;
	int t=1; cin>>t;
	int n = t;
	while(t--){
		cin>>a;
		int sum=0,zz;
		bool single = true;
		for(int i=0;i<17;i++){
			if(a[i]<'0'||a[i]>'9'){
				all = false;
				single = false;
			}
			if(single==false){
				cout<<a<<endl;
				break;
			}
			int num = a[i]-'0';
			sum+=num*q[i+1];
		}
		if(single == false) continue;
		zz = sum%mod;
		if(check(zz,a[17])){
			
		}
		else{
			all = false;
			single = false;
			cout<<a<<endl;
			continue;
		}
		
	}
	if(all==true) cout<<"All passed";
	return 0;
}

T3 帅到没朋友(模拟)

题目:

代码:

#include <iostream>
#include <cstring>
using namespace std;
int n,q,t,x,f[100005],v[100005];
void init(){
	memset(v,0,sizeof(v));
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		init();
		cin>>t;
		for(int i=1;i<=t;i++){
			cin>>x;
			if(v[x]) f[x]--;
			else f[x]+=t-1,v[x]=1;
		}
	}
	bool sp=true;
	cin>>q;
	while(q--){
		cin>>t;
		if(f[t]==-1) continue;
		if(!f[t])
			cout<<t<<' ',sp=false,f[t]=-1;
	}
	if(sp) cout<<"No one is handsome";
}

T4 输出GPLT(模拟)

题目:

代码:

#include <iostream>
using namespace std;
char s[8]={'G','P','L','T','g','p','l','t'};
int cnt[5],tot;
int main(){
	string a;
	cin>>a;
	for(int i=0;i<a.length();i++) 
		for(int j=0;j<4;j++){
			if(a[i]==s[j]||a[i]==s[j+4]){
				cnt[j]++;
				tot++;
			}
		}
	int i=0;
	while(tot--){
		while(!cnt[i]){
			i++;
			i%=4;
		}
		cout<<s[i];
		cnt[i]--,i++,i%=4;
	}
	return 0;
}

T5 判断素数(暴力)

题目:

代码:

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int t; cin>>t;
	while(t--){
		bool no=false;
		long long int num;
		cin>>num; if(num==1){
			cout<<"No"<<endl;
			continue;
		}
		for(int i=2;i<=sqrt(num);i++){
			if(num%i==0){
				no=true;
				break;
			}
		}
		if(no==true) cout<<"No"<<'\n';
		else cout<<"Yes"<<'\n';
	}
	return 0;
}

T6 最佳情侣身高差(签到)

题目:

代码:

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int t; cin>>t;
	while(t--){
		char a; cin>>a;
		double h; cin>>h;
		if(a=='M') printf("%.2lf\n",h/1.09);
		else printf("%.2lf\n",h*1.09);
	}
	return 0;
}

T7 连续因子(数学)

题目:

求连续因子,N的上界是2^31,所以只需要遍历sqrt(2^31)≈ 5e4次去更新答案即可。注意特判质数的情况,因子只有一个即为它本身。

代码:

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int ans1=0,st;
	int n; cin>>n;
	for(int i=2;i<sqrt(n);i++){
		int num=n,now = i;
		int cnt = 0;
		while(num%now==0){
			cnt++;
			num/=now;
			now++;
		}
		if(ans1 < cnt){
			ans1 = cnt;
			st = i;
		}
	}
	if(ans1){
		cout<<ans1<<endl<<st;
		for(int i=1;i<ans1;i++) cout<<"*"<<st+i;
	}
	else cout<<"1"<<endl<<n;
}

L2-1 红色警报

题目:

样例:

用搜索+并查集判断连通块数量,重要的城市被摧毁时连通块会增多。

代码:

#include <iostream>
#include <cstring>
using namespace std;
int n,m,k,a[505][505],vis[505],f[505],c[505],d[505];
bool calc(int dest){
	bool b1[505],b2[505];//backet
	memset(b1,0,sizeof(b1));
	memset(b2,0,sizeof(b2));
	int cnt1=0,cnt2=0;
	for(int i=1;i<=n;i++){
		if(!b1[f[i]]){
			b1[f[i]]=1;
			cnt1++;
		}
		if(!b2[c[i]]){
			b2[c[i]]=1;
			cnt2++;
		}
	}
	if(cnt1!=cnt2) return false;
	else return true;
}//qiu lian tong kuai
void cpy(){
	for(int i=1;i<=n;i++){
		c[i] = f[i];
	}
}
void init(){
	for(int i=1;i<=500;i++) f[i]=i;
}
int getf(int v){
	if(f[v]==v) return v;
	else{
		f[v] = getf(f[v]);
		return f[v];
	}
}
void merge(int x,int y){
	x = getf(x);
	y = getf(y);
	if(x<=y) f[x] = y;
	else f[y] = x;
}
void dfs(int x){
	for(int i=1;i<=n;i++){
		if((vis[i]==0)&&(a[x][i]==1)&&(d[505]==false)){
			merge(x,i);
			vis[i]=1;
			dfs(i);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);
	cin>>n>>m;
	init();
	for(int i=1;i<=m;i++){
		int st,ed;
		cin>>st>>ed;
		st++,ed++;
		a[st][ed]=1;
		a[ed][st]=1;
	}
	dfs(1);
	
	cin>>k;
	for(int i=1;i<=k;i++){
		init();
		memset(vis,0,sizeof(vis));
		int temp; cin>>temp; temp++;
		d[temp] = 1;
		for(int j=1;j<=n;j++)
		dfs(j);//new f[i]
		if(calc(temp)){
			printf("City %d is lost!\n",temp-1);
		}
		else if((!calc(temp))&&(i==k&&k==n)){
			printf("Red Alert: City %d is lost!\n",temp-1);
		}
		else{
			cout<<"Game Over"<<'\n';
		}
		cpy();
	}
	return 0;
}

]]>
第四次双周赛/天梯赛选拔赛(Week 15) https://forelink.top/index.php/2023/05/13/%e7%ac%ac%e5%9b%9b%e6%ac%a1%e5%8f%8c%e5%91%a8%e8%b5%9b-%e5%a4%a9%e6%a2%af%e8%b5%9b%e9%80%89%e6%8b%94%e8%b5%9b%ef%bc%88week-15%ef%bc%89/ Sat, 13 May 2023 08:02:32 +0000 https://forelink.top/?p=166 T1 重要的话说三遍(签到)

题目:

代码:

#include <iostream>
int main(){
    int t=3;
    while(t--) std::cout<<"I'm gonna Win!"<<'\n';
    return 0;
}

T2 日期格式化

题目:

#include <bits/stdc++.h>
using namespace std;
int main(){
	int m,d,y;
	cin>>m;
	getchar();//读入时跳过 ‘-’ 符号
	cin>>d;
	getchar();
	cin>>y;
	getchar();
	cout<<y<<"-";
	if(m<10) cout<<"0"<<m<<"-";
	else cout<<m<<"-";
	if(d<10)cout<<"0"<<d;
	else cout<<d;
	return 0;
}

T3 大笨钟

题目:

代码:

#include <bits/stdc++.h>
using namespace std;
stack <int > z;
int main(){
	int h,m;
	cin>>h; getchar(); cin>>m;
	if((h<12)||(h==12&&m==0)){
		cout<<"Only ";
		if(h<10) {
			cout<<"0"<<h<<":";
		} else cout<<h<<":";
		if(m<10){
			cout<<"0"<<m;
		} else cout<<m;
		cout<<".  Too early to Dang.";
	}
	else{
		h-=12;
		if(m!=0) h++;
		while(h--) cout<<"Dang";
	}
	return 0;
}

T4 拯救外星人

题目:

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long int a,b,ans=1;
	cin>>a>>b;
	a+=b;
	for(int i=1;i<=a;i++){
		ans*=i;
	}
	cout<<ans;
	return 0;
}

T5 个位数统计

题目:

代码:

#include <bits/stdc++.h>
using namespace std;
int m[11];
int main(){
	char n;
	while(cin>>n){
		m[n-'0']++;
	}
	for(int i=0;i<=9;i++){
			m[i]? (cout<<i<<":"<<m[i]<<endl) : continue;
	}
	return 0;
}

T6 正整数

题目:

这是孬的模拟,数据读入上会造成很大的麻烦,因为L部分和R部分可能存在非数字的字符所以不能够直接读入整型变量里。为了好定位第一个空格的位置,方便判断L部分的合法性,我用了单字符逐个读入的方法,遇到空格时停止。然后再将输入数据的剩余部分全部读入到R部分中,再逐个判断。代码当然没有必要写的那么复杂,不过我也懒得改了就是; ;

#include <bits/stdc++.h>
using namespace std;
bool rno,lno;
int main(){
	string a="",b="";
	char temp;
	while(temp=getchar()){
		if(isspace(temp)){
			break;
		}
		a = a+temp;
	}
	getline(cin,b);

	if(a.length()>4) lno=true;
	if(b.length()>4) rno=true;
	int lnum=0,rnum=0;
	
	for(int i=0;i<a.length();i++){
		if(a[i]>='0'&&a[i]<='9'){
			if(lnum==0&&((a[i]-'0')==0)){
				lno=true;
				break;
			}
			lnum*=10;
			lnum+=a[i]-'0';
		}
		else{
			lno=true;
			break;
		}
	}
	for(int i=0;i<b.length();i++){
		if(b[i]>='0'&&b[i]<='9'){
			if(rnum==0&&(b[i]-'0'==0)){
				rno=true;
				break;
			}
			rnum*=10;
			rnum+=b[i]-'0';
		}
		else{
			rno=true;
			break;
		}
	}
	if(lnum>1000||lnum<1) lno=true;
	if(rnum>1000||rnum<1) rno=true;
	if(lno==false) cout<<lnum;
	else cout<<"?";
	
	cout<<" + ";
	
	if(rno==false) cout<<rnum;
	else cout<<"?";
	cout<<" = ";
	if(lno==true||rno==true)
		cout<<"?";
	else cout<<lnum+rnum;
	
//	cout<<endl<<lno<<" "<<rno;
}

T7 打印沙漏

题目:

要先算出能够打印出的层数,然后用层数变量控制符号与空格的数量(注意到第i层有 2i 个空格,2(max-i)-1 个符号),由于上下层是对称的,所以我的做法是直接打一半,另一半以字符串的形式存在栈里,很方便。

代码:

#include <iostream>
#include <stack>
using namespace std;
stack <string > a;
int n;
char f;
int main(){
	cin>>n; cin>>f;
	int h;
	for(int i=1;i<=99999;i++){
		if(i*i*2-1>n){
			h = i-1;
			break;
		}
	}
	int remain = n - h*h*2 +1;
	for(int i=1;i<=h;i++){
		string temp="";
		for(int j=1;j<i;j++) temp = " "+temp;
		for(int j=1;j<=(h-i+1)*2-1;j++) temp = temp + f;
		cout<<temp<<endl;
		a.push(temp);
	}
	a.pop();
	while(!a.empty()){
		cout<<a.top()<<endl;
		a.pop();
	}
	cout<<remain;
	return 0;
}

T8 机工士姆斯塔迪奥

题目:

代码:

#include <iostream>
using namespace std;
long long int row[100005],line[100005],tot,n,m,q,t,eaten,stat,r,l;
void prework(){
	cin>>n>>m>>q;
	tot = n*m;
	for(int i=1;i<=q;i++){
		cin>>stat>>t;
		if(stat==0&&row[t]==0)
			r++ , row[t]=1;
		else if(stat==1&&line[t]==0) l++, line[t]=1;
	}
}
void solve(){
	tot = tot + l*r - l*n - r*m;
	cout<<tot;
}
int main(){
	prework();
	solve();
	return 0;
}

L2-1

题目:

样例:

上来写了个领接矩阵,一交WA了。再读一遍题发现漏掉朋友的朋友也是朋友这个条件,敲出并查集提交过了。

#include <iostream>
using namespace std;
bool check;
int n,t,q;
int a[105][105];
int f[105];
void init(){
	for(int i=1;i<=103;i++) f[i]=i;
}
int getf(int x){
	if(f[x]==x) return x;
	else{
		f[x]=getf(f[x]);
		return f[x];
	}
}
void merge(int a,int b){
	a=getf(a);
	b=getf(b);
	if(a!=b){
		f[a]=b;
	}
}
int main(){
	init();
	cin>>n>>t>>q;
	for(int i=1;i<=t;i++){
		int x1,x2,x3;
		cin>>x1>>x2>>x3;
		a[x1][x2]=x3;
		a[x2][x1]=x3;
		if(x3==1) merge(x1,x2);
	}
	for(int i=1;i<=q;i++){
		check = false;
		int x1,x2;
		cin>>x1>>x2;
		if(a[x1][x2]==1) cout<<"No problem"<<endl;
		else if(a[x1][x2]==0) cout<<"OK"<<endl;
		else if(a[x1][x2]==-1){
			for(int i=1;i<=n;i++){
				if(i==x1||i==x2) continue;
				if(getf(x1)==getf(x2)){
					check=true;
				}
			}
			if(check) cout<<"OK but..."<<endl;
			else cout<<"No way"<<endl;
		}
	}
	return 0;
}

L2-2 名人堂与代金券(数据结构)

题目:

样例:

代码:

#include <bits/stdc++.h>
using namespace std;
int n,g,k,ans,cnt;
struct student{
	string email;
	int score;
}stu[100005];
bool cmp(student a,student b){
	if(a.score>b.score)
		return true;
	else if(a.score==b.score){
		if(a.email>b.email){
			return false;
		} 
		else return true;
	}
	else return false;
}

void prework(){
	cin>>n>>g>>k;
	for(int i=1;i<=n;i++){
		cin>>stu[i].email;
		int x2;
		cin>>x2;
		if(x2>=g) ans+=50;
		else if(x2<g&&x2>=60) ans+=20;
		stu[i].score=x2;
	}
	sort(stu+1,stu+n+1,cmp);
}
int main(){
	prework();
	cout<<ans<<endl;
	int rank=1;
	if(k>=1) cout<<rank<<' '<<stu[1].email<<' '<<stu[1].score<<endl;
	cnt++;
	for(int i=2;i<=n;i++){
		if(stu[i].score==stu[i-1].score){
			cnt++;
		}
		else{
			cnt++;
			rank = cnt;
		}
		if(rank<=k)
		cout<<rank<<' '<<stu[i].email<<' '<<stu[i].score<<endl;
		else break;
	}
	return 0;
}

比较函数写的混乱不堪,重写一遍应该是这个样子:

bool cmp(student a,student b){
	if(a.score!=b.score) 
		return a.score>b.score;
	else{
		return a.email<b.email;
	}
}

]]>
第二次双周赛。 https://forelink.top/index.php/2022/12/12/%e7%ac%ac%e4%ba%8c%e6%ac%a1%e5%8f%8c%e5%91%a8%e8%b5%9b%e3%80%82/ Mon, 12 Dec 2022 10:36:48 +0000 https://forelink.top/?p=100 T1 输出全排列

是暑假就做过的题!
代码如下。

#include <iostream>
using namespace std;
int n;
int a[11],vis[11];
void dfs(int step){
	if(step==n+1){
		for(int i=1;i<=n;i++){
			cout<<a[i];
		}
		cout<<endl;
		return;
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==0){
			a[step]=i;
			vis[i]=1;
			dfs(step+1);
			vis[i]=0;
		}
	}
	return;
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}

T2 山

是一道非常经典的搜索题,题中的山可以换成:细胞,海岛(bushi)。
不过我的实现方式比较复杂了!

代码如下。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
queue<int> x1;
queue<int> y1;
queue<int> tx;
queue<int> ty;
int world[2005][2005];
int color[2005][2005];
int vis[2005][2005];
int n,m;
int ans;
int movex[5]={0,0,0,1,-1};
int movey[5]={0,1,-1,0,0};
int main(){
	memset(world,0x3f,sizeof(world));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int l=1;l<=m;l++){
			cin>>world[i][l];
			if(world[i][l]==1){
				x1.push(i);
				y1.push(l);
			}
		}
	}
	while(!x1.empty()){
		int xx=x1.front();
		int yy=y1.front();
		if(vis[xx][yy]==1){
			x1.pop();
			y1.pop();
			continue;
		}
		vis[xx][yy]=1;
		tx.push(xx);
		ty.push(yy);
		while(!tx.empty()){
			int x2=tx.front();
			int y2=ty.front();
			for(int i=1;i<=4;i++){
				int x3=x2+movex[i];
				int y3=y2+movey[i];
				if(x3>=1&&x3<=n&&y3>=1&&y3<=m&&world[x3][y3]==1&&vis[x3][y3]==0){
					tx.push(x3);
					ty.push(y3);
					vis[x3][y3]=1;
				}
			}
			tx.pop();
			ty.pop();
		}
		ans++;
		x1.pop();
		y1.pop();
	}
	cout<<ans;
}

T3 跳跃

和奇怪的电梯差不多,但是这道题是要找到元素值为0的下标位置。
不用输出步数所以bfs或者dfs都可。(不过我bfs调了超久诶诶诶)

代码如下。

#include <iostream>
#include <queue>
using namespace std;
const int N=5e5+5;
int start,n;
int num[N];
int step[N];
int vis[N];
queue<int> x;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>num[i];
	}
	cin>>start;
	if(num[start]==0){
		cout<<"True";
		return 0;
	}
	vis[start]=1;

	x.push(start);
	while(!x.empty()){

		int x1=x.front();

		if(num[x1]==0){
			cout<<"True";
			return 0;
		}
		int s=num[x1];
		int l=x1-s;
		int r=x1+s;
		if(l>=0){
			if(vis[l]==0){
				vis[l]=1;
				x.push(l);
			}
		}
		if(r<n){
			if(vis[r]==0){
				vis[r]=1;
				x.push(r);
			}
		}
		x.pop();
	}
	cout<<"False";
	return 0;
}

T4 回文数回文

草,这道题败在了不会估计时间复杂度上面。
从起始数到极限数据回文数并不多,可以枚举。

代码如下。

#include <iostream>
using namespace std;
int ans;
int getnum(int n){
	int temp=n;
	int a[6];
	n/=10;
	for(int i=1;i<=4;i++){
		a[i]=n%10;
		n/=10;
	}
	for(int i=1;i<=4;i++){
		temp*=10;
		temp+=a[i];
	}
	return temp;
}
int main(){
	int a;
	cin>>a;
	for(int i=10000;i<=99999;i++){
		if(getnum(i)<=a){
			ans++;
		}
	}
	cout<<ans;
}

T5 最长光路

这道题怎么一股oi味。(指题面和样例)

代码非常蠢呢 还有一个点过不去www。

#include <iostream>
#include <cstring>
using namespace std;
const int INF=0x3f3f;
//1为上,2为右,3为下,4为左。
//  \可以用\\来表示。
//  \ 1->4 2->3 3->2 4->1

//  / 1->2 2->1 3->4 4->3
char world[505][505];
int vis[505][505][6];
int n,m;
int sx,sy;
int nx,ny;
long long int ans;
char ansdir;
long long int len;
bool check(int x,int y){
	if(x<1||y<1) return 0;
	if(x>n||y>m) return 0;
	if(world[x][y]=='C') return 0;
	return 1;
}
void go(int x,int y,int status){
	if(status==1){
		nx=x-1, ny=y;
	}
	else if(status==2){
		nx=x, ny=y+1;
	}
	else if(status==3){
		nx=x+1, ny=y;
	}
	else if(status==4){
		nx=x, ny=y-1;
	}
}

void dfs(int x,int y,int status){
	++len;
	if(vis[x][y][status]){
		len=INF;
		return;
	}
	else vis[x][y][status]=1;
	if(world[x][y]=='/'){
		if     (status==1) status=2;
		else if(status==2) status=1;
		else if(status==3) status=4;
		else if(status==4) status=3;
	}
	if(world[x][y]=='\\'){
		if     (status==1) status=4;
		else if(status==2) status=3;
		else if(status==3) status=2;
		else if(status==4) status=1;
	}
	go(x,y,status);//更新x和y的值。
	if(!check(nx,ny)) return;
	dfs(nx,ny,status);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int l=1;l<=m;l++){
			cin>>world[i][l];
		}
	}
	cin>>sx>>sy;
	memset(vis,0,sizeof(vis));
	len=0;
	dfs(sx,sy,1);
	if(len>ans) ansdir='U',ans=len;
	
	memset(vis,0,sizeof(vis));
	len=0;
	dfs(sx,sy,2);
	if(len>ans) ansdir='R',ans=len;
	
	memset(vis,0,sizeof(vis));
	len=0;
	dfs(sx,sy,3);
	if(len>ans) ansdir='D',ans=len;
	
	memset(vis,0,sizeof(vis));
	len=0;
	dfs(sx,sy,4);
	if(len>ans) ansdir='L',ans=len;
	
	cout<<ansdir<<endl;
	if(ans!=INF){
		cout<<ans;
	}
	else cout<<"COOL"<<endl;
	return 0;
}

]]>