题目意思:给你两个“[整数部分].[小数部分]”的实数,每个实数长度不超过100位,问你两者谁大谁小?
模拟高精度即可,先比较实数部分,若两者长度不同,长度大的数就大,若两者长度相同,从头比到尾。
若实数部分相同,就比较小数部分,将他们放到一个数组里面,从头比到位即可。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t=0;
int x1[200],x2[200];
string s1,s2;
while(cin>>s1>>s2)
{
int a,b;
a=b=0;
memset(x1,0,sizeof(x1));
memset(x2,0,sizeof(x2));
for(int i=0;i<s1.size();++i)
{
if(s1[i]=='.')
{
a=i;
break;
}
}
for(int i=0;i<s2.size();++i)
{
if(s2[i]=='.')
{
b=i;
break;
}
}
int flag=0;
if(a<b) flag=-1;
else if(a>b) flag=1;
else
{
for(int i=0;i<a;++i)
{
if(s1[i]<s2[i]) {flag=-1;break;}
if(s1[i]>s2[i]) {flag=1;break;}
}
if(flag==0)
{
for(int i=a+1;i<s1.size();++i)
x1[i-1-a]=s1[i]-'0';
for(int i=b+1;i<s2.size();++i)
x2[i-1-b]=s2[i]-'0';
for(int i=0;i<100;++i)
{
if(x1[i]<x2[i]) {flag=-1;break;}
if(x1[i]>x2[i]) {flag=1;break;}
}
}
}
cout<<"Case "<<++t<<": ";
if(flag==0) cout<<"Same\n";
else if(flag<0) cout<<"Smaller\n";
else cout<<"Bigger\n";
}
}
题目意思:给你一个四位数A,通过修改A的一位数字可以变成其他的(四位的)完全平方数?
暴力枚举即可。
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
for(int j=1;j<=t;++j)
{
int n;
cin>>n;
int sum=0;
for(int i=32;i<=99;++i)
{
int q=n;
int tmp=0;
int p=i*i;
while(p)
{
if(p%10==q%10)
tmp++;
p/=10;
q/=10;
}
if(tmp==3) sum++;
}
cout<<"Case "<<j<<": ";
cout<<sum<<endl;
}
}
题目意思:给你一个数字k,要你输出两个数字:n,m,其中,k=n!/m!,有多解,输出n最小的,若不存在,输出"Impossible"
枚举连续因子的个数+map预处理
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
map<int,int>m1;
map<int,int>m2;
typedef long long ll;
const int N=1000000000;
int num=0;
void init()
{
int q=1;
for(int i=2;i<=13;++i)
{
q=q*i;
int tmp=q;
for(int j=2;j<=N;++j)
{
if((ll)tmp/(j-1)*(j+i-1)>N) break;
tmp=tmp/(j-1)*(j+i-1);
if(m1[tmp])
{
if(m1[tmp]>i+j-1)
{
m1[tmp]=i+j-1;
m2[tmp]=j-1;
}
}
else
{
m1[tmp]=i+j-1;
m2[tmp]=j-1;
}
}
}
//cout<<num<<endl;
}
int main()
{
int t=0;
int k;
init();
while(cin>>k)
{
int n,m;
n=k,m=k-1;
cout<<"Case "<<++t<<": ";
if(k==1) {cout<<"Impossible\n";continue;}
if(m1[k])
{
if(n>m1[k])
{
n=m1[k];
m=m2[k];
}
}
cout<<n<<' '<<m<<endl;
}
}
题目意思:题目意思
正确解的个数可能不唯一,因此要把他们都找出来,怎么找?每一行每一列的格子暴力枚举即可。
而错误的算法算出来的格子是唯一:即最大行的r最小,最大列的c最小
把两者一一对照即可,又相同的,就是Weak,否则就是Strong
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node{int x,y;};
int a[600][600];
int r[600],c[600];
int n,m,t=0;
node false_ans;
int vis[600][600];
int main()
{
while(cin>>n>>m)
{
mem(r,0);
mem(c,0);
mem(vis,0);
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++ j){
cin>>a[i][j];
r[i]+=a[i][j];
c[j]+=a[i][j];
}
}
int total = 0;
int cnt = 0;
for(int i = 1;i <= n;++ i){
for(int j =1;j <= m;++ j){
int tmp = r[i] + c[j] - a[i][j];
if(total < tmp) {
total = tmp;
}
}
}
for(int i = 1;i <= n;++ i){
for(int j = 1;j <= m;++ j){
int tmp = r[i] + c[j] - a[i][j];
if(tmp == total){
vis[i][j]=1;
}
}
}
int k = 0;
for(int i = 1;i <= n;++ i){
if(k < r[i]){
k = r[i];
false_ans.x = i;
}
}
k = 0;
for(int i = 1;i <= m; ++i){
if(k < c[i]){
k = c[i];
false_ans.y=i;
}
}
printf("Case %d: ",++t);
if(vis[false_ans.x][false_ans.y]) printf("Weak\n");
else printf("Strong\n");
}
}
题目意思:题目意思
注意点:
1.要用while(getline(cin,s))用来读取一行string(含空格,到换行截至),一直都入到文件结尾
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define mod 1e9+7
#define PSS pair<string,string>
using namespace std;
int num=0;//不同的对话总数,给不同的对话编以先后顺序,从1开始
string s;
string last[120];//不断替换对话双方的最后一句话
map<PSS,int>dia;
int main()
{
dia.clear();
for(int i=0;i<120;++i) last[i]="";
//memset(hashs,0,sizeof(hashs));
while(getline(cin,s))
{
getline(cin,s);
string first,second;
first=second="";
int len=s.size();
int next=0;//是否是第二个名字
for(int i=0;i<len;++i)
{
if(s[i]==':') break;
if(s[i]=='-'||s[i]=='>') {next=1;;continue;}
if(next==0) first+=s[i];
if(next==1) second+=s[i];
}
if(first>second) swap(first,second);
if(dia[make_pair(first,second)]==0)
{
num++;
dia[make_pair(first,second)]=num;
}
last[dia[make_pair(first,second)]]=s;
}
int hehe=0;
int skip;
for(int i=1;i<=num;++i){
for(int j=0;j<last[i].size();j=j+skip){
skip=1;
if(last[i][j]!='h'&&last[i][j]!='H') continue;
else
{
skip=0;
int k;
int ok=1;
int tran=0;
for(k=j;k<last[i].size();++k)
{
skip++;
if(last[i][k]==' ') break;
if(tran==0&&(last[i][k]=='h'||last[i][k]=='H'))
{
tran=!tran;
continue;
}
if(tran==1&&(last[i][k]=='e'||last[i][k]=='E'))
{
tran=!tran;
continue;
}
else ok=0;
}
if(last[i][k-1]!='e'&&last[i][k-1]=='E') ok=0;
if(ok) hehe++;
}
}
}
cout<<hehe*100.0/num<<"%\n";
}