第五次双周赛(week 16)

发布于 2023-05-14  222 次阅读


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;
}