新键盘入手,赶紧拿几道题来练练手
1017 Coderforce上的rating
思路:这个确实水题一道,数据结构存储rating,然后排序输出就好了
新键盘的第一个程序,成就达成
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e4+10;
typedef struct RATING
{
string name;
int score;
}Rating;
Rating rating[maxn];
bool cmp(const Rating &a,const Rating &b)
{
if(a.score>b.score)
{
return true;
}
else if(a.score==b.score&&a.name<b.name)
{
return true;
}
else
{
return false;
}
}
int main()
{
int n;
ios::sync_with_stdio(false);
while(cin>>n)
{
if(n==0)
{
break;
}
for(int i=0;i<n;i++)
{
cin >> rating[i].name >> rating[i].score;
}
sort(rating,rating+n,cmp);
for(int i=0;i<n;i++)
{
cout <<rating[i].name << " " << rating[i].score << endl;
}
}
return 0;
}
1028: 数字工程
思路:由于每次只能对素数操作,于是分解质因数就成了最显而易见的想法,质因数个数就是结果,然而这样虽然过了样例,然而突然发现,完全忽视了第一个条件
于是想到几个dp,更新最后结果
然而,由于两种操作可以相互进行,或许就需要一个dp搜索了
于是素数筛上场,每次都是由除去一个素数后所得结果转移而来
然而,事实证明,除不同的素数结果是不一样的
迫不得已,强行转移所以可以得来的情况,再剪枝一下,O(nlog(n)),啊哦,TLE,被卡了
其实,逆向暴搜,考虑每次可以转移到的情况,而不是转移来的情况,可以将O(n^2)的算法,降为O(1e6*n-n^2)<O(nlog(n))成功
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e6+10;
int a[maxn];
bool visit[maxn];
vector <int> prime;//素数
//bool isprime[maxn];
void getPrime(int n)
{
memset(visit,false,sizeof(visit));
//memset(isprime,false,sizeof(isprime));
prime.clear();
for(int i=2;i<n;i++)
{
if(!visit[i])
{
prime.push_back(i);
a[i] = 1;
//isprime[i] = true;
}
int len = prime.size();
for(int j=0;j<len&&i*prime[j]<n;j++)
{
visit[i*prime[j]] = true;
if(i%prime[j]==0)
{
break;
}
}
}
}
void factor (int n)
{
getPrime(n);
for(int k=2;k<=n;k++)
{
//cout <<"a["<<k<<"]="<<a[k] << endl;
if(a[k]==-1||a[k]>(a[k-1]+1))
{
a[k] = a[k-1]+1;
}
//cout <<"a["<<k<<"]="<<a[k] << endl;
/*if(k%(100000)==0)
{
cout << "*" <<k<< endl;
}*/
int len = prime.size();
for(int i=0;i<len&&prime[i]*k<=n;i++)
{
int temp = prime[i] * k;
if(a[temp]==-1||a[temp]>(a[k]+1))
{
a[temp] = a[k]+1;
}
}
/*if(isprime[k])
{
a[k] = 1;
}
else
{
a[k] = a[k-1] + 1;
int si = prime.size();
//int en = int(sqrt(double(k))+1);
//for(int i=0;i<si&&prime[i]<=en;i++)
for(int i=lower_bound(prime.begin(),prime.end(),k)-prime.begin()-1;i>=0;i--)
{
//cout << "*"<<i<<"*";
if(k % prime[i] == 0)
{
if(a[k] > 1 + a[k/prime[i]])
{
a[k] = 1 + a[k/prime[i]];
}
break;
}
}
for()
}*/
//cout << "*" << endl;
}
}
int main()
{
int n;
memset(a,-1,sizeof(a));
a[0] = 0;
a[1] = 0;
factor(1000000);
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}
文章地址:http://blog.csdn.net/owen_q/article/details/78301229